返回

最小栈:LeetCode第155题的巧妙解决方案

前端

前言:栈的概念与LeetCode第155题

栈是一种先进后出的线性数据结构,元素只能从栈顶进入或离开。与队列不同,栈遵循“后进先出”的原则。LeetCode第155题要求我们设计一个支持push、pop、top操作,并能在常数时间内检索到最小元素的栈。这道题的难点在于如何在维护栈基本功能的同时,高效地检索最小元素。

巧妙的解决方案:辅助栈的妙用

为了高效地实现最小栈的功能,我们引入一个辅助栈minStack。minStack始终存储栈中所有元素的最小值,即使这些元素已经被pop出。当我们push一个元素x时,如果x小于或等于minStack栈顶元素,则将x也push进minStack。如果x大于minStack栈顶元素,则不将x放入minStack。

当我们pop一个元素时,如果被pop出的元素是minStack栈顶元素,则同时从minStack中pop出该元素。否则,不从minStack中pop出任何元素。

算法实现:伪代码与Java代码

class MinStack {
    private Stack<Integer> stack;
    private Stack<Integer> minStack;

    public MinStack() {
        stack = new Stack<>();
        minStack = new Stack<>();
    }

    public void push(int x) {
        stack.push(x);
        if (minStack.isEmpty() || x <= minStack.peek()) {
            minStack.push(x);
        }
    }

    public void pop() {
        int x = stack.pop();
        if (x == minStack.peek()) {
            minStack.pop();
        }
    }

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

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

算法分析:时间复杂度和空间复杂度

  • 时间复杂度:

    • push():O(1)
    • pop():O(1)
    • top():O(1)
    • getMin():O(1)
  • 空间复杂度:O(n),其中n是栈中元素的数量。

结语

LeetCode第155题最小栈的巧妙解决方案在于利用辅助栈minStack来维护栈中所有元素的最小值。这种方法简单易懂,时间复杂度和空间复杂度都为O(1),非常适合处理涉及最小值检索的栈问题。希望本文对您有所启发,也欢迎您在评论区留下您的想法和建议。