📘题目描述
设计一个支持 push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack
类:
MinStack()
初始化堆栈对象。void push(int val)
将元素val推入堆栈。void pop()
删除堆栈顶部的元素。int top()
获取堆栈顶部的元素。int getMin()
获取堆栈中的最小元素。
示例 1:
输入: ["MinStack","push","push","push","getMin","pop","top","getMin"] [[],[-2],[0],[-3],[],[],[],[]] 输出: [null,null,null,null,-3,null,0,-2] 解释: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2.
💡解题思路:辅助栈存最小值
使用两个栈:
-
主栈
stack
:用于存储所有元素 -
辅助栈
min_stack
:用于存储当前最小值
✅维护逻辑:
-
push(val)
:-
正常推入
stack
-
如果
val <= min_stack[-1]
,也推入min_stack
-
-
pop()
:-
如果弹出值等于
min_stack[-1]
,也要同步弹出
-
-
getMin()
:-
返回
min_stack[-1]
即可,时间复杂度 O(1)
-
✅Python代码
class MinStack:
def __init__(self):
self.stack = [] # 主栈,存所有元素
self.min_stack = [] # 辅助栈,存最小值
def push(self, val: int) -> None:
self.stack.append(val)
# 只有当 val 更小或相等时才入最小栈
if not self.min_stack or val <= self.min_stack[-1]:
self.min_stack.append(val)
def pop(self) -> None:
val = self.stack.pop()
# 如果弹出的是最小值,也要同步弹出辅助栈
if val == self.min_stack[-1]:
self.min_stack.pop()
def top(self) -> int:
return self.stack[-1]
def getMin(self) -> int:
return self.min_stack[-1]
⏱️复杂度分析
操作 | 时间复杂度 | 空间复杂度 |
---|---|---|
push | O(1) | O(n) |
pop | O(1) | O(n) |
top | O(1) | O(1) |
getMin | O(1) | O(1) |
🧱易错点总结
易错点 | 正确做法说明 |
---|---|
弹出主栈未同步辅助栈 | if val == min_stack[-1] 时也要 pop |
辅助栈每次都入栈所有元素 | 应该只记录当前最小值(含重复) |
空栈判断不完整或越界访问 | 注意所有访问 [-1] 前判断非空 |
🧠优化拓展
✅方式二:辅助栈存 (val, 当前最小值)
元组
class MinStack:
def __init__(self):
self.stack = []
def push(self, val: int) -> None:
current_min = val if not self.stack else min(val, self.stack[-1][1])
self.stack.append((val, current_min))
def pop(self) -> None:
self.stack.pop()
def top(self) -> int:
return self.stack[-1][0]
def getMin(self) -> int:
return self.stack[-1][1]
优点:结构更紧凑,只用一个栈存储所有信息。
🎯总结
-
本题是栈的经典设计题,重点考查辅助栈思想
-
所有操作需 O(1) 完成,推荐双栈结构或元组压栈方式实现
-
是系统设计类题目的入门题之一,适合练习类封装、状态管理等技巧