【剑指Offer30】包含min函数的栈

题目描述(2021-3-12)

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

示例1:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.min();   --> 返回 -2.

说明:

  1. 各函数的调用总次数不超过 20000 次

解题思路

维护一个数据栈和一个辅助栈。数据栈用于存放每次新进入的x,辅助栈用于存放每个x进入数据栈后的最小值降序排列,(即辅助栈的top()始终存放着当前数据栈的最小值)。

参考代码

class MinStack {
    
    
        Stack<Integer> s1;
        Stack<Integer> s2;


    /** initialize your data structure here. */
    public MinStack() {
    
    
        //栈1存放需要压栈的值
        s1 = new Stack<>();
        //栈2存放最小值
        s2 = new Stack<>();

    }
    
    public void push(int x) {
    
    
        //入栈1
        s1.push(x);
        //如果栈2为空或入栈的值小于等于栈2的栈顶元素,则入栈2
        if(s2.empty() || s2.peek() >= x){
    
    
            s2.push(x);
        }
    }
    
    public void pop() {
    
    
        //栈1弹出去的值等于栈2的栈顶值,栈2弹出
        if(s1.pop().equals(s2.peek())){
    
    
            s2.pop();
        }
    }
    
    public int top() {
    
    
        return s1.peek();
    }
    
    public int min() {
    
    
        return s2.peek();
    }
}

/**
 * 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();
 */

运行结果

执行用时:22 ms, 在所有 Java 提交中击败了91.27%的用户

内存消耗:40.3 MB, 在所有 Java 提交中击败了69.32%的用户

猜你喜欢

转载自blog.csdn.net/li643937579/article/details/114762372