Leetcode115.最小栈

file

题目要求维护一个栈,除了支持普通栈的压栈,查顶,弹出操作外,还需支持一个O(1)的查询栈内最小元素的操作

可以这么思考这个问题:

定义一个普通的栈s,一个保存当前栈s的最小元素的栈sMin,对于压栈和弹出操作,他们两个保持同步

对于一个新压入的元素x,如果x大于等于现在已知的栈内最小元素,则x对于最小元素是没有贡献的,有没有他都一样,所以压入s,sMin压入当前sMin.top(),用于保持两个栈的元素同步,以维护弹出操作,此时可以说我们维持现状

对于小于当前已知的栈内最小元素x,应当同时压入两个栈中,此时可以说更新答案

class MinStack {
public:
    stack<int> s;
    stack<int> sMin;

    MinStack() {
        ;
    }

    void push(int val) {
        if (s.empty()) {
            s.push(val);
            sMin.push(val);
        }else if (val < sMin.top()) {
            // 更新答案
            s.push(val);
            sMin.push(val);
        } else {
            // 维持现状
            s.push(val);
            sMin.push(sMin.top());
        }
    }

    void pop() {
        s.pop();
        sMin.pop();
    }

    int top() {
        return s.top();
    }

    int getMin() {
        return sMin.top();
    }
};

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注