問題描述:
實現一個最小棧,包含以下方法: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]];
}
}