剑指 Offer 30. 包含min函数的栈(单调栈)

Description
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)

Solution
光靠一个栈必然是无法实现O(1)查询min的,故我们考虑再加一个栈
在维护一个正常的栈sta1的同时,维护一个非减的栈sta2(top是最小值之一)
每次查询min的值时即为栈sta2顶的值
为什么这样是正确的?

假设当前需要push的值为x, 而sta2栈顶的值为y:
若x > y,按照我们的设计,x不需要压入sta2栈中, 因为在栈中位置更靠底部的y都将比x更晚被pop出,故x值无论在不在栈中,都对其min值无影响(影响被更小且更底部的y值所完全覆盖);
反之则将x push进sta2栈中;

pop时,若需要pop的值x等于sta2栈顶的值y,说明x在push时同时也push进了sta2栈中,所以将y也从sta2中pop出。

因此,我们实现了O(1)时间复杂度调用min、push及pop函数,实际上也就是用空间(需要另开一个栈)换时间

Code

class MinStack {
public:
    /** initialize your data structure here. */
    static const int maxn = 2e4 + 7;
    int sta1[maxn], tail1;
    int sta2[maxn], tail2;
    MinStack() {
        tail1 = tail2 = 0;
        sta1[tail1] = sta2[tail2] = 0;
    }
    
    void push(int x) {
        sta1[tail1++] = x;
        if(!tail2) sta2[tail2++] = x;
        else if(x <= sta2[tail2-1]) sta2[tail2++] = x;
    }
    
    void pop() {
        if(tail1 == 0) return ;
        int x = sta1[tail1-1];
        tail1--;
        if(sta2[tail2-1] == x) tail2--;
    }
    
    int top() {
        return sta1[tail1-1];
    }
    
    int min() {
        return sta2[tail2-1];
    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(x);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->min();
 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值