题目
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
思路
创建一个辅助栈,用于存储每次push后的最小值,同时在pop后更新辅助栈中的最小值。
代码
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = [] # 数据栈
self.min_stack = [] # 不断把最小元素压入最小栈中
def push(self, x: int) -> None:
self.stack.append(x)
if not self.min_stack or self.min_stack[-1] >= x:
self.min_stack.append(x)
def pop(self) -> None:
if self.stack.pop() == self.min_stack[-1]:
self.min_stack.pop()
def top(self) -> int:
return self.stack[-1]
def min(self) -> int:
return self.min_stack[-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()
进一步优化,不用每次都把最小值入最小栈,只需要比较当前stack中的栈顶元素和最小值,如果大于最小值,则最小值所在的栈就不用出栈。
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = []
self.stackMin = []
def push(self, x: int) -> None:
self.stack.append(x)
if not self.stackMin or x <= self.stackMin[-1]:
self.stackMin.append(x)
def pop(self) -> None:
if self.top() == self.stackMin[-1]:
self.stackMin.pop()
self.stack.pop()
def top(self) -> int:
return self.stack[-1]
def min(self) -> int:
return self.stackMin[-1]