题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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.
解题思路: 最小栈辅助法
- 初始化时, 我们创建2个栈, 第一个为主栈, 存放所有元素. 第二个为最小栈, 存放存在过的最小值元素(栈顶为最小值).
- 入栈时, 主栈先入栈. 如果入栈元素小于最小栈的栈顶元素, 就将入栈元素入栈最小栈, 保障当前元素入栈以后, 最小栈的栈顶为所有元素的最小值
- 出栈时, 主栈先出栈. 如果最小栈的栈顶元素与出栈元素相同, 那么将最小栈的栈顶也出栈, 那么最小栈的栈顶就是当前出栈元素未加入时历史的最小值
- top()函数直接返回主栈的栈顶元素
- min()函数直接返回最小栈的栈顶元素
示例代码
class MinStack:
def __init__(self):
self.mins, self.all = [], []
def push(self, x: int) -> None:
self.all.append(x)
if not self.mins or self.mins[-1] >= x:
self.mins.append(x)
def pop(self) -> None:
if self.all.pop() == self.mins[-1]:
self.mins.pop()
def top(self) -> int:
return self.all[-1]
def min(self) -> int:
return self.mins[-1]