【刷题打卡】155. 最小栈

475 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

155. 最小栈 - 力扣(LeetCode) (leetcode-cn.com)

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

实现 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.

提示:

  • -2^31 <= val <= 2^31 - 1
  • pop、top 和 getMin 操作总是在 非空栈 上调用
  • push, pop, top, and getMin最多被调用 3 * 10^4 次

二、思路分析:

  1. 维护一个最小值,每次push的时候都和最小值进行比较,如果小于最小值则更新
  2. 核心思路:每次多push一个当前的最小值,相当于一个辅助栈的作用
  3. 维护每次额外push的最小值:在pop的时候要pop两次,把目标值和当时的栈最小值都pop掉。这里要判断一下pop结束后时候为空,为空min要初始化,不为空要设置为栈顶元素(因为pop两次后的栈顶元素就是当时栈的最小元素!)。top也是一样,要先把栈顶(当前栈最小值)pop掉,拿到后再push回来~

三、AC 代码:


class MinStack {
    Deque<Integer> xStack;
    //记录栈最小值
    int min;

    public MinStack() {
        xStack = new LinkedList<Integer>();
        min = Integer.MAX_VALUE;
    }
    
    public void push(int x) {
        xStack.push(x);
        min = Math.min(min,x);
        xStack.push(min);
    }
    
    public void pop() {
        xStack.pop();
        int pop = xStack.pop();
        if(!xStack.isEmpty() && pop==min){
            min = xStack.peek();
        }else if(xStack.isEmpty()){
            min = Integer.MAX_VALUE;
        }
    }
    
    public int top() {
        xStack.pop();
        int re = xStack.peek();
        xStack.push(min);
        return re;
    }
    
    public int getMin() {
        return min;
    }
}

四、总结:

该题的考/难点不是实现栈的操作,而是怎么保存最小值(所以不用手写栈)。

范文参考:

最小栈 - 最小栈 - 力扣(LeetCode) (leetcode-cn.com)