Min Stack 解题报告

Min Stack

Description

Implement a stack with min() function, which will return the smallest number in the stack.

It should support push, pop and min operation all in O(1) cost.

Notice

min operation will never be called if there is no number in the stack.

Example

push(1)
pop()   // return 1
push(2)
push(3)
min()   // return 2
push(1)
min()   // return 1

实现思路

对于实现一个最小栈,我们不能简单地维护一个最小元素,因为当弹出最小元素后,我们需要找出第2小的作为当前的最小,故因此我们应该额外维护一个栈,里面放的是一系列最小元素。
具体实现原理是,每当我们弹入一个元素到栈里,判断它是否比最小栈的栈顶元素小,如果是,就弹入栈里,最小栈从栈顶到栈底应该是一个从小到大排列的序列。而在我们取出元素的时候,再判断取出的是否等于最小栈栈顶元素(即是否为当前栈里的最小元素)。如果是,就弹出最小栈栈顶元素。
通过此机制,我们维护了一个最小栈,举个例子,我们依次弹入以下元素:
4、5、6、2、3、1
则最小栈为:
4、2、1,对应下表:

普通栈最小栈
44
4、54
4、5、64
4、5、6、24、2
4、5、6、2、34、2
4、5、6、2、3、14、2、1

弹出时,序列弹出顺序为1、3、2、6、5、4
时序对应下表:

普通栈最小栈
4、5、6、2、3、14、2、1
4、5、6、2、34、2
4、5、6、24、2
4、5、64
4、54
44

从弹入、弹出的每一过程看,我们的操作,都确保了最小栈的栈顶元素,都是普通栈中的最小元素

根据此思路,求解方法如下:

public class MinStack {

    private Stack<Integer> minStack;
    private Stack<Integer> stack;
    public MinStack() {
        this.minStack = new Stack<>();
        this.stack = new Stack<>();
    }

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

    public int pop() {
        int number = stack.pop();
        if(number == minStack.peek()){
            minStack.pop();
        }
        return number;
    }

    public int min() {
        return minStack.peek();        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值