O(1)复杂度求一个栈的最小值

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32623363/article/details/87894111

要求一个栈的最小值,第一反应肯定是一个个出栈,那样太蠢了,如何更优呢?

第一个思路就是自己定义一个指针,始终指向保存了最小值的那个节点不就行了。看似正确,但是当你最小值的那个节点出栈了,那么如何找到下一个最小值呢?

因此,我们需要一个数据结构来保存每一个状态下的最小值。即我们应当知道每当栈中插入一个新元素后的最小值位置,也应当知道每当栈中删除一个元素后的最小值的位置。

做法很简单,用另一个栈来记录每一个状态下的最小值的位置即可!
我们假设原来的那个栈叫stack,用来记录最小值位置的栈叫minStack,那么我们要做的就是让minStack随着stack的变化而动态变化,stack出栈时,minStack跟着出栈,stack入栈时,minStack跟着入栈。
minStack入栈的是什么呢?很显然,是拿stack新入栈的元素和minStack栈顶元素比较大小,如果minStack栈顶元素比stack新入栈元素小,那么minStack就入栈一个和原来minStack栈顶元素相同的的元素,否则入栈新入栈的这个元素的指针。
新入栈的元素如果和原来minStack栈顶元素一样大,那么入不入栈都行,因为后入栈的必定先出栈,不论如何都可以保证一直都能找到最小值。

说了这么多,想练练手的可以去:https://leetcode-cn.com/problems/min-stack/

下面放上我的代码:

class MinStack {
public:
    /** initialize your data structure here. */
    
    stack<int> sstack;
    stack<int> minStack;
    
    MinStack() {
        
    }
    
    void push(int x) {
        sstack.push(x);
        if(minStack.size() == 0)
        {
            minStack.push(x);
            return;
        }
        int originTop = minStack.top();
        if(x <= originTop)
        {
            minStack.push(x);
        }else{
            minStack.push(originTop);
        }
    }
    
    void pop() {
        sstack.pop();
        minStack.pop();
    }
    
    int top() {
        return sstack.top();
    }
    
    int getMin() {
        return minStack.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.getMin();
 */

猜你喜欢

转载自blog.csdn.net/qq_32623363/article/details/87894111