最小棧

問題描述:
實現一個最小棧,包含以下方法:push、pop、getMin(返回棧中最小值)

分析:
由於棧具有pushpop方法,因此棧中的最小值是不固定的;因此可以通過維持另一個棧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]];
    }
}

參考

  1. https://juejin.im/post/5a2ff8c651882533d0230a85
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章