LeetCode 155. Min Stack

相较普通的栈,题目要求多实现一个操作getMin(): 获取栈中最小的元素   

我们维护两个栈:普通栈s保存所有元素, 最小栈min_s保存s中的“曾出现过”的最小元素的递减序列

min_s.top()即为getMin()的返回值,标识普通栈s里的最小元素。


考虑压栈 3 4 5 2 3 1, 它们有如下表现:

push   3 4 5 2 3 1

s         3 4 5 2 3 1

min_s 3        2    1

亦即,当push(x)的x < min_s.top()时,我们将x压入min_s中。

大家可以发现,在上述push操作的任意间隔加我们若调用getMin()函数,min_s.top()即为所求。


接下来考虑pop()操作,当且仅当s.top() == min_s.top()时,我们才弹出min_s的元素,这样就可以维护min_s.top()为s里的最小值的性质。


代码:

class MinStack 
{
public:
    void push(int x) 
    {
        s.push(x);        
        if (min_s.empty() || x<=min_s.top() )
        {
            min_s.push(x);                          
        }
    }

    void pop() 
    {
        if (min_s.top() == s.top())
        {
            s.pop();
            min_s.pop();
        } else
        {
            s.pop();
        }
    }

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

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

private:
    stack<int> s;
    stack<int> min_s;
};


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值