题目
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
1.pop、push、getMin操作的时间复杂度都是O(1)。2.设计的栈类型可以使用现成的栈结构。
解答
使用一个栈保存每次入栈的元素;使用一个辅助栈保存当前栈的最小元素。
当push一个元素x时,考虑:
- 如果辅助栈为空,那么将该元素x压入辅助栈;
- 如果辅助栈不为空,比较辅助栈栈顶元素和当前元素x,如果x小于等于栈顶元素,则将该元素压入辅助栈
当pop一个元素x时,考虑:
- 如果辅助栈 栈顶元素 < x,则当前最小值依然不变,不更新辅助栈;
- 如果辅助栈 栈顶元素 == x,则说明当前最小值已经弹出,需要更新辅助栈。
代码
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = []
self.auxStack = []
def push(self, x: int) -> None:
if not self.stack or x <= self.auxStack[-1]:
self.auxStack.append(x)
self.stack.append(x)
def pop(self) -> None:
if self.stack.pop() == self.auxStack[-1]:
self.auxStack.pop()
def top(self) -> int:
return self.stack[-1]
def min(self) -> int:
return self.auxStack[-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()