Skip to content

最小栈


题目链接

https://leetcode.cn/problems/min-stack/

思路分析

新增一个 minStack,和 data 栈同步更新(压入一个元素时),minStack 的栈顶记录了当前栈中元素的最小值

(1)当两个栈为空时,同步压入

(2)当前压入的元素 <= minStack.peek(),则 minStack 中压入当前元素

(3)当前压入元素 > minStack.peek(),则 minStack 中压入 minStack.peek(),即重复压入最小栈的栈顶

当元素出栈时,两个栈同步执行 pop()操作

代码实现

内部实现

java
class MinStack {
    public Stack<Integer> data;
    public Stack<Integer> min;

    public MinStack() {
        data = new Stack<Integer>();
        min = new Stack<Integer>();
    }

    public void push(int val) {
        data.push(val);
        if (min.isEmpty() || val <= min.peek()) {
            min.push(val);
        } else {
            // !min.isEmpty() && val > min.peek()
            min.push(min.peek());
        }
    }

    // pop 操作注意是同步执行的
    public void pop() {
        data.pop();
        min.pop();
    }

    public int top() {
        return data.peek();
    }

    public int getMin() {
        return min.peek();
    }
}

数组实现

java
class MinStack {
    // leetcode的数据在测试时,同时在栈里的数据不超过这个值
    // 这是几次提交实验出来的,哈哈
    // 如果leetcode补测试数据了,超过这个量导致出错,就调大
    public final int MAXN = 8001;

    public int[] data;
    public int[] min;
    int size;

    public MinStack() {
        data = new int[MAXN];
        min = new int[MAXN];
        size = 0;
    }

    public void push(int val) {
        // 首先处理 data 栈,之后再对 min 栈进行处理
        data[size] = val;
        if (size == 0 || val <= min[size - 1]) {
            min[size] = val;
        } else {
            min[size] = min[size - 1];
        }
        size++;
    }

    // 两个栈的大小都是 size,size-- 即同步了两个栈的 pop 操作
    public void pop() {
        size--;
    }

    public int top() {
        return data[size - 1];
    }

    public int getMin() {
        return min[size - 1];
    }
}