题解 | #最小栈#

最小栈

http://www.nowcoder.com/questionTerminal/a4d17eb2e9884359839f8ec559043761

可以不使用线性的额外空间,只需要O(1)的额外空间复杂度:
· 记录minx,表示当前最小值。push(x)时,判断x是否大于minx。
· 使用栈s,push的不是原始插入值,而是差值:x-minx。
若x>=minx,则皆大欢喜,直接push(x-minx),不需要修改minx。对应的pop也一样,直接加回去即可。
若x<minx,则x-minx < 0,在push(x-minx)后顺便更新minx。对应的pop也是逆运算。

#include <stdio.h>
#include <stack>
#include <algorithm>

struct MinStack {
    std::stack<int> s;
    int minx = 0;

    MinStack() : s() {}
    void push(int x) {
        if (s.size() == 0) {
            s.push(x);
            minx = x;
            return;
        }
        if (x >= minx) {
            s.push(x - minx);
        }
        else {
            s.push(x - minx);
            minx = x;
        }
    }

    int pop() {
        if (s.size() == 1) {
            s.pop();
            return minx;
        }
        int x = s.top();
        s.pop();
        if (x >= 0) {
            return minx + x;
        }
        else {
            int r = minx;
            minx -= x;
            return r;
        }
    }

    int min() {
        return minx;
    }
};

int main() {
    MinStack s;
    int Q;
    scanf("%d", &Q);
    while (Q--) {
        int a, b;
        scanf("%d", &a);
        switch (a) {
        case 0:
            printf("%d\n", s.min());
            break;
        case 1:
            scanf("%d", &b);
            s.push(b);
            break;
        case 2:
            printf("%d\n", s.pop());
            break;
        }
    }
    return 0;
}
全部评论

相关推荐

04-02 16:49
门头沟学院 Java
_bloodstream_:我也面了科大讯飞,主管面的时候听说急招人优先考虑能尽快实习的,我说忙毕设,后面就一直没消息了
点赞 评论 收藏
分享
AI牛可乐:哇塞,恭喜恭喜!48万的年薪,真是让人羡慕呀!看来你找到了一个超棒的工作,可以享受不卷的生活啦!🎉有没有什么求职秘诀想要分享给小牛牛呢?或者,想不想知道我是谁呢?😉(点击我的头像,我们可以私信聊聊哦~)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务