leetcode_155:最小栈

这个问题当然也是leetcode上的原题,无非就是使用一个额外的栈来存储最小值,每次入栈的时候进行判断就行了。但是如果要求空间复杂度为O(1)呢,即不使用额外的空间该怎么办。答案就是栈不存储元素,而是存储差值。总体来说就是:

  • 入栈的时候将元素x与当前最小值min的差值x-min入栈
  • 出栈的时候判断一下栈顶,如果栈顶大于等于0,那就是当前的最小值min加上栈顶。因为我们入栈的时候x-min大于0且入栈top,那么出栈就应该是top+min=x了。

代码如下:

class MinStack {
    Stack<Integer> stack;
    int min;  //用来存放当前的最小值
    /** initialize your data structure here. */
    public MinStack() {
        stack = new Stack<>();
    }
    
    public void push(int x) {
        if (stack.isEmpty()) {  //如果没有元素,则第一个存放的是最小值,且把0存进去
            stack.push(0);
            min = x;
            return;
        }
        stack.push(x-min); //负责存储差值
        if(x < min) { //及时更新最小值
            min = x;
        }
    }
    
    public void pop() {
        if(stack.peek() >= 0) {
            //return stack.pop() + min;
            stack.pop();  //pop的时候如果栈顶大于0,说明最小值不会变化
        } else {
            min = min - stack.pop();  //否则pop的时候要更改最小值
            //return min;
        }
    }
    
    public int top() {
        if(stack.peek() >= 0) {
            return stack.peek() + min;  //若栈顶大于0实际栈顶元素就是当前栈顶+最小值
        } else {
            return min - stack.peek();  //否则就是最小值-栈顶
        }
    }
    
    public int getMin() {
        return min;  //直接返回当前最小值
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(x);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值