问题描述:
实现一个最小栈,包含以下方法:push、pop、getMin(返回栈中最小值)
分析:
由于栈具有push
和pop
方法,因此栈中的最小值是不固定的;因此可以通过维持另一个栈B用于保存历史最小元素的下标;
每次入栈时判断入栈元素是否小于当前最小元素,小于则更新最小值同时将其下标保存在栈B中;
每次出栈时判断出栈元素是否为当前最小元素,是则同时将栈B中的栈顶元素出栈;此时栈B的栈顶仍然是栈A的最小元素下标;
实现:
// 最小栈:实现一个栈,包含push/pop/getMin
class MinStack {
constructor() {
this.stack = [];
this.minIndex = [];
this.min = null;
}
push(item) {
this.stack.push(item);
if (item < this.min || this.min === null) {
this.min = item;
this.minIndex.push(this.stack.length-1);
}
}
pop() {
let item = this.stack.pop();
if (item = this.min) {
this.minIndex.pop();
this.min = this.stack[this.minIndex[this.minIndex.length - 1]]; // 更新最小值
}
}
getMin() {
return this.stack[this.minIndex[this.minIndex.length - 1]];
}
}