[LeetCode]Min Stack

Question
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

  • push(x) – Push element x onto stack.
  • pop() – Removes the element on top of the stack.
  • top() – Get the top element.
  • getMin() – Retrieve the minimum element in the stack.

Example:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); –> Returns -3.
minStack.pop();
minStack.top(); –> Returns 0.
minStack.getMin(); –> Returns -2.


本题难度Easy。

双栈法

【复杂度】
时间 O(N) 空间 O(N)

【思路】
暴力的方法是遍历一遍栈得出最小值,这样不用多余的空间。但如果我们能使用空间来记录到目前为之最小的数呢?我们只要记录一个最小数的顺序,和栈的操作顺序对应起来就可以在任何时候做到O(1)获取最小值了。因为这个最小值的顺序也是先进后出,我们同样用一个栈来记录。这样主栈在push时,如果该值小于等于副栈顶,就也push进副栈中。当主栈pop时,如果pop出的元素是副栈栈顶的话,副栈也要pop。

这里写图片描述

【注意】

  1. 判断是否加入副栈时,等于的情况也要加入,因为可能有多个重复的最小值,我们也需要多次抛出这些重复的最小值
  2. 当栈为空时,peek会抛出异常,这里要和面试官沟通好如何处理栈为空的情况

【代码】

public class MinStack {
    private Stack<Integer> stack=new Stack<>();
    private Stack<Integer> min=new Stack<>();
    /** initialize your data structure here. */
    public MinStack() {

    }

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

    public void pop() {
        int x=stack.pop();
        if(!min.isEmpty()&&x==min.peek())min.pop();

    }

    public int top() {
        if(!stack.isEmpty())return stack.peek();
        else                return 0;
    }

    public int getMin() {
        if(!min.isEmpty())return min.peek();
        else              return 0;
    }
}

参考

[Leetcode] Min Stack 最小栈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值