力扣 hot100 Day60

155. 最小栈

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

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。
cpp 复制代码
class MinStack {
private:
    stack<int> main_stack;
    stack<int> min_stack;

public:
    MinStack() {}

    void push(int val) {
        main_stack.push(val);

        if (min_stack.empty() || val <= min_stack.top()) {
            min_stack.push(val);
        }
    }
    
    void pop() {
        if (main_stack.top() == min_stack.top()) {
            min_stack.pop();
        }
        main_stack.pop();
    }
    
    int top() {
        return main_stack.top();
    }
    
    int getMin() {
        return min_stack.top();
    }
};

我的思路是维护一个有序数组,这样就能直接得到当前最小值了

但不必这么复杂,由于这是个栈,所以只会像栈一样读入读出,只需要在栈读入读出时维护一个当前最小值的栈即可

具体来说,入栈时,栈空或当前值小于最小栈顶,同步入最小栈;出栈时,等于最小栈顶则同步出

最小栈中不一定有所有元素,但一定有栈维护时任意时刻的最小值,相当于历史快照,这就足够了