4. 实现最小栈
来源:腾讯一面
题目
实现一个栈,支持 push、pop、top、getMin 操作,其中 getMin 能在
代码
js
// 实现栈push/pop/getMin等方法
// 腾讯一面
class Stack{
constructor(){
this.stack = [];
this.minStack = [];
}
push(x){
this.stack.push(x);
if(this.minStack.length === 0 || x <= this.getMin()){
this.minStack.push(x);
}
}
pop(){
const val = this.stack.pop();
if(val === this.getMin()){
this.minStack.pop();
}
}
top(){
return this.stack[this.stack.length - 1];
}
getMin(){
return this.minStack[this.minStack.length - 1];
}
}
const stack = new Stack();
stack.push(3);
stack.push(5);
stack.push(2);
console.log(stack.getMin()); // 2
stack.pop();
console.log(stack.getMin()); // 3
console.log(stack.top()); // 5思路
使用辅助栈同步记录最小值:
- 维护两个栈:
stack:正常的数据栈minStack:最小值栈,栈顶始终是当前栈中的最小值
push(x)操作:- 将
x压入stack - 如果
x小于等于当前最小值,也压入minStack
- 将
pop()操作:- 弹出
stack栈顶元素 - 如果弹出的值等于当前最小值,也弹出
minStack栈顶
- 弹出
getMin()操作:- 直接返回
minStack栈顶元素
- 直接返回
关键点
- 使用辅助栈同步维护最小值,空间换时间
push时判断条件是<=,不是<,因为可能有重复的最小值pop时需要判断弹出的值是否是最小值,如果是则同步弹出minStack- 所有操作的时间复杂度都是
- 空间复杂度