LeetCode OJ Min Stack

这题难就难在对空间的限制十分严格。

这个方法是看了Discuss然后自己写的。

注意不要用pair<bool, int>作为一个栈的元素来代替两个栈。

因为,pair<bool, int>的size是4*2,而不是我们认为的4+1。

至于为什么,好像是个值得研究的问题...

class MinStack {

public:

    void push(int x) {

        if (s.empty()) {

            s.push(0);

            si.push(false);

            m = x;

        } else {

            long temp = x - m;

            if (temp < INT_MIN) s.push(temp - INT_MIN), si.push(true);

            else if (temp > INT_MAX) s.push(temp - INT_MAX), si.push(true);

            else s.push(temp), si.push(false);

            if (x < m) m = x;

        }

    }

    void pop() {

        if (s.empty()) return;

        long temp = s.top();

        if (temp < 0) {

            if (si.top()) temp -= INT_MIN;

            m = m - temp;

        }

        s.pop();

        si.pop();

    }

    int top() {

        long temp = s.top();

        if (temp > 0)

            if (si.top()) return temp + m + INT_MAX;

            else return temp + m;

        else return m;

    }

    int getMin() {

        return m;

    }

    stack<int> s;

    stack<bool> si;

    long m;

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值