155. 最小栈
Origin: LeetCode 155
题目描述
设计一个支持 push、pop、top 操作,并能在 O(1) 时间检索到最小元素的栈。
接口
MinStack()初始化push(val)将元素压入栈pop()移除栈顶元素top()获取栈顶元素getMin()获取栈中最小元素(O(1))
示例
MinStack minStack = new MinStack()
minStack.push(-2)
minStack.push(0)
minStack.push(-3)
minStack.getMin() // 返回 -3
minStack.pop()
minStack.top() // 返回 0
minStack.getMin() // 返回 -2
约束
- -2^31 <= val <= 2^31 - 1
- pop、top、getMin 操作总是在非空栈上调用
- push、pop、top、getMin 的时间复杂度都是 O(1)
关键信息
- 你做过 HackerRank 第 41 题(双栈队列),栈操作很熟
- 关键:一个栈存数据,另一个栈存当前最小值
- getMin 直接读辅助栈栈顶,O(1)
Resolution
我的解法
class MinStack {
stack: number[] = []
minStack: number[] = []
push(value: number): void {
this.stack.push(value)
const min = this.minStack[this.minStack.length - 1] ?? value
if (this.minStack.length && value < min) {
this.minStack.push(value)
} else {
this.minStack.push(min)
}
}
pop(): void {
this.stack.pop()
this.minStack.pop()
}
top(): number {
return this.stack[this.stack.length - 1]
}
getMin(): number {
return this.minStack[this.minStack.length - 1]
}
}解题思路
双栈:stack 存数据,minStack 存当前最小值。
push 时:
- stack 正常 push
- minStack push 的是 min(当前值, minStack 栈顶)。如果 minStack 为空,push 当前值
pop 时两个栈同步 pop,保证 minStack 栈顶始终是当前 stack 的最小值。getMin 直接读 minStack 栈顶,O(1)。
复杂度
- push/pop/top/getMin:都是 O(1)
- 空间:O(n),两个栈