【剑指Offer】30.包含min函数的栈

题目

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(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 次

解答

源代码

class MinStack {
    public Deque numStack;
    public Deque minStack;

    /** initialize your data structure here. */
    public MinStack() {
        numStack = new ArrayDeque<>();
        minStack = new ArrayDeque<>();
    }
    
    public void push(int x) {
        numStack.offerLast(x);
        if (!minStack.isEmpty()) {
            minStack.offerLast(Math.min(minStack.peekLast(), x));
        } else {
            minStack.offerLast(x);
        }
    }
    
    public void pop() {
        numStack.pollLast();
        minStack.pollLast();
    }
    
    public int top() {
        return numStack.peekLast();
    }
    
    public int min() {
        return minStack.peekLast();
    }
}

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

总结

因为栈的特点是先进后出,只要栈顶元素不变,它下面的所有元素也都是固定的。

那么我们就可以再声明一个辅助栈,和主栈同步进出,用于记录每个元素作栈顶元素时当前栈的最小元素。

你可能感兴趣的:(剑指Offer,java,算法,leetcode,栈)