题目
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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]
