当前位置 博文首页 > 中流击水,浪遏飞舟:双栈&&剑指 Offer 30. 包含min函数

    中流击水,浪遏飞舟:双栈&&剑指 Offer 30. 包含min函数

    作者:[db:作者] 时间:2021-08-26 12:46

    参考大佬的题解,理解用双栈在O(1)时间实现在stack< int >中查找最小值的min()方法:

    大佬的力扣题解精选链接

    大佬的图让我翻然醒悟:(下面是大佬的图

    在这里插入图片描述

    解释:

    1. 首先需要一个主栈来完成除min()外的基本操作;

    2. 用一个辅助栈来完成min()的操作,辅助栈存储的是主栈的非严格降序元素,所以辅助栈的top()一直都是主栈的最小值!而且只有在主栈空的时候辅助栈才会空!push()中辅助栈的if中小于等于是为了存储重复数字!

    自己理解后重新写的Min代码:(完全是看图理解后写的代码

    原先自己写的O(n)时间查找stack< int >最小值的方法超时了且不符合题意,需要O(1)时间查找栈的最小值

    class MinStack {
    public:
        /** initialize your data structure here. */
        stack<int> a;
        stack<int> b;
        MinStack() {
    
        }
        
        void push(int x) {
            a.push(x);
            if(b.empty()||b.top()>=x){
                b.push(x);
            }
        }
        
        void pop() {
            if(b.top()==a.top()){
                b.pop();
            }
            a.pop();
        }
        
        int top() {
            return a.top();
        }
        
        int min() {
            return b.top();
        }
    };
    
    /**
     * 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();
     */
    
    cs