AcWing 41 包含min函数的栈

题目描述:

设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈。

  • push(x)–将元素x插入栈中
  • pop()–移除栈顶元素
  • top()–得到栈顶元素
  • getMin()–得到栈中最小元素

样例

MinStack minStack = new MinStack();
minStack.push(-1);
minStack.push(3);
minStack.push(-4);
minStack.getMin();   --> Returns -4.
minStack.pop();
minStack.top();      --> Returns 3.
minStack.getMin();   --> Returns -1.

分析:

本题考察单调栈。

牺牲空间换时间,为了能在O(1)时间内完成各种操作,设置一个辅助栈mi,该栈中所有元素从栈底到栈顶大小递减。

如何做到实现单调栈mi,mi为空时,直接压入;mi非空,新入栈的元素小于栈顶元素,同样压入。当然栈s的操作不用改变,在出栈时,若两个栈栈顶元素相同,则均要出栈;求最小值,mi栈栈顶元素即是最小值。

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> s;
    stack<int> mi;
    MinStack() {
        
    }
    
    void push(int x) {
        s.push(x);
        if(mi.empty() || x <= mi.top())    mi.push(x);
    }
    
    void pop() {
        if(s.top() == mi.top())   mi.pop();
        s.pop();
    }
    
    int top() {
        return s.top();
    }
    
    int getMin() {
        return mi.top();
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值