剑指 Offer 30. 包含min函数的栈
Posted 炫云云
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 30. 包含min函数的栈相关的知识,希望对你有一定的参考价值。
剑指 Offer 30. 包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
辅助栈
解题思路:
普通栈的 push()
和 pop()
函数的复杂度为
O
(
1
)
O(1)
O(1) ;而获取栈最小值 min()
函数需要遍历整个栈,复杂度为
O
(
N
)
O(N)
O(N)。
本题难点: 将 min()
函数复杂度降为 O(1) ,可通过建立辅助栈实现;
- 数据栈 A : 栈 A 用于存储所有元素,保证入栈
push()
函数、出栈pop()
函数、获取栈顶top()
函数的正常逻辑。 - 辅助栈 B : 栈 B中存储栈 A中所有 非严格降序 的元素,则栈 A** 中的最小元素始终对应栈 B 的栈顶元素,即
min()
函数只需返回栈 B 的栈顶元素即可。
因此,只需设法维护好栈 B 的元素,使其保持非严格降序,即可实现 min()
函数的
O
(
1
)
O(1)
O(1)复杂度。
函数设计:
push(x)
函数: 重点为保持栈 B 的元素是 非严格降序 的。- 将 x 压入栈 A(即
A.add(x)
); - 若 ① 栈 B 为空 或 ② x小于等于 栈 B 的栈顶元素,则将 x 压入栈 B(即
B.add(x)
)。
- 将 x 压入栈 A(即
pop()
函数: 重点为保持栈 A, B 的 元素一致性 。
-
执行栈 A A A 出栈(即
A.pop()
),将出栈元素记为 y y y ; -
若 y y y 等于栈 B B B 的栈顶元素,则执行栈
B
出栈(即B.pop()
)。
top()
函数: 直接返回栈 A的栈顶元素即可,即返回A.peek()
。min()
函数: 直接返回栈 B 的栈顶元素即可,即返回B.peek()
。
class MinStack(object):
def __init__(self):
"""
initialize your data structure here.
"""
self.A, self.B = [], []
def push(self, x):
"""
:type x: int
:rtype: None
"""
self.A.append(x)
if not self.B or self.B[-1] >= x:
self.B.append(x)
def pop(self):
"""
:rtype: None
"""
if self.A.pop() == self.B[-1]:
self.B.pop()
def top(self):
"""
:rtype: int
"""
return self.A[-1]
def min(self):
"""
:rtype: int
"""
return self.B[-1]
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.min()
参考
以上是关于剑指 Offer 30. 包含min函数的栈的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode(剑指 Offer)- 30. 包含min函数的栈