1. 题目
[原题链接]定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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.
提示:各函数的调用总次数不超过 20000 次
注意:本题与LeetCode主站 155 题相同:https://leetcode-cn.com/problems/min-stack/
2. 思路
- 若每次压入一个新元素进栈时,将栈里的所有元素排序,让最小的元素位于栈顶,就能在O(1)时间内得到最小元素。但是这样破坏了栈的数据结构,不能保证最后压入栈的元素能够最先出栈。
- 若在栈里添加一个成员变量存放最小的元素,每次压入一个新元素进栈的时候更新最小元素,也能在O(1)时间内得到最小元素。但是这样如果当前最小的元素被弹出栈了,无法得到下一个最小元素。
所以我们不仅希望得到最小元素,还希望得到次小元素,自然地想到用一个辅助栈来存放每次的最小元素,来实现 O(1) 复杂度的min函数。过程可以先通过一个具体的例子来理解。
所以数据栈用于保持栈的原始正常逻辑;辅助栈用于存储数据栈中所有非严格降序的元素,使最小元素永远位于辅助栈的栈顶。在定义pop()函数时注意保持两个栈元素的一致性:当最小元素从数据栈内被弹出之后,同时弹出辅助栈的栈顶元素,保证辅助栈的新栈顶元素就是下一个最小值。
3. 实现
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.A, self.B = [], []
def push(self, x: int) -> None:
self.A.append(x)
if not self.B or self.B[-1] >= x:
self.B.append(x)
def pop(self) -> None:
if self.A.pop() == self.B[-1]:
self.B.pop()
def top(self) -> int:
return self.A[-1]
def min(self) -> 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()
4. 其它
- 题目难度:简单
- 相关题目: