最小栈-leetcode

题目描述

设计一个支持 pushpoptop 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

示例 1:

输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

提示:

  • -231 <= val <= 231 - 1
  • poptopgetMin 操作总是在 非空栈 上调用
  • push, pop, top, and getMin最多被调用 3 * 104

解法一

思路:

采用两个列表,一个记录当前入栈元素,一个记录最小元素。

当操作主列表时,我们需要同步操作最小元素列表:

  1. 添加元素 (add):
    • 将新元素添加到 dataDeque
    • 比较新元素与 minDeque 栈顶的元素:
      • 如果 minDeque 为空,或者新元素小于等于 minDeque 的栈顶元素,则将新元素也添加到 minDeque 的栈顶。
      • 为什么要用小于等于?因为如果有多个相同的最小值,我们需要确保在这些最小值被移除后,仍然能正确地找到下一个最小值。
  2. 删除最后一个元素 (removeLast):
    • dataDeque 中移除最后一个元素。
    • 如果移除的这个元素 等于 minDeque 的栈顶元素,那么也从 minDeque 中移除栈顶元素。
    • 如果移除的元素不等于 minDeque 的栈顶元素,说明它不是当前的最小值,或者有其他更小的元素在 minDeque 中,所以 minDeque 不需要改变。
  3. 获取最小值 (getMin):
    • 直接返回 minDeque 的栈顶元素。如果 minDeque 为空,说明主列表也为空,没有最小值。

注意:

不会出现5,2,3,删除2后出现最小值出错的情况,因为栈中元素删除有顺序,先入后出。

代码:

class MinStack {

    private List<Integer> stack;
    private List<Integer> minStack;

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

    public void push(int val) {
        stack.add(val);
        if(minStack.isEmpty()) minStack.add(val);
        else if(val <= minStack.get(minStack.size() - 1)) minStack.add(val);
    }

    public void pop() {
        if(stack.isEmpty()) return;
        int val = stack.get(stack.size() - 1);
        stack.remove(stack.size()-1);
        if(minStack.get(minStack.size() - 1) == val) minStack.remove(minStack.size() - 1);
    }

    public int top() {
        if(stack.isEmpty()) return -1;
        return stack.get(stack.size()-1);
    }

    public int getMin() {
        if(stack.isEmpty()) return -1;
        return minStack.get(minStack.size() - 1);
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */
posted @ 2026-04-02 21:30  狐狸胡兔  阅读(3)  评论(0)    收藏  举报