70.最小栈

3 阅读1分钟

题目链接

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

解法 2个栈辅助

思路

最小栈的难点就在于时刻获取最小的元素,此时我们用额外的栈来维护最小的元素即可。

pushpop 操作时,最小栈也需要操作,只不过添加时最小栈需要添加当前元素和当前栈尾最小元素比较后的最小元素。

获取最小元素就是最小栈的最后一个元素。

代码

class MinStack {
    private stk: number[];
    private minStk: number[];

    constructor() {
        this.stk = [];
        this.minStk = [];
    }

    push(val: number): void {
        this.stk.push(val);
        const min = this.minStk.length === 0 ? val : Math.min(val, this.minStk[this.minStk.length - 1]);
        this.minStk.push(min);
    }

    pop(): void {
        this.stk.pop();
        this.minStk.pop();
    }

    top(): number {
        return this.stk[this.stk.length - 1];
    }

    getMin(): number {
        return this.minStk[this.minStk.length - 1];
    }
}

时空复杂度

时间复杂度:所有方法都是 O(1)

空间复杂度:O(n)