【LeetCode】Min Stack(最小栈)

83 篇文章 1 订阅
65 篇文章 1 订阅

这道题是LeetCode里的第155道题。

题目描述:

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

  • push(x) -- 将元素 x 推入栈中。
  • pop() -- 删除栈顶的元素。
  • top() -- 获取栈顶元素。
  • getMin() -- 检索栈中的最小元素。

示例:

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

这题看起来挺简单的,但其实设计起来还挺复杂,或者说坑比较多,对 空栈 的处理很严格。

解题代码:

class MinStack {
    Stack<Integer> minStack;
    Stack<Integer> data;
    /** initialize your data structure here. */
    public MinStack() {
        minStack = new Stack<Integer>();
        data = new Stack<Integer>();
    }
    
    public void push(int x) {
        data.push(x);
        if(minStack.empty())
            minStack.push(x);
        else if(minStack.peek() >= x)
            minStack.push(x);
//       else
//            minStack.push(x);
//        if(x <= minStack.peek())
//            minStack.push(x);
    }
    
    public void pop() {
        if(data.empty())return;
        //System.out.print(data.peek());
        //System.out.print(" "+minStack.peek());
        //System.out.print(" "+minStack.empty());
        //System.out.print(" "+(data.peek().equals(minStack.peek())));
        //if(!minStack.empty() && data.peek() == minStack.peek()){
        if(!minStack.empty() && data.peek().equals(minStack.peek())){
            //System.out.print(" "+minStack.peek());
            minStack.pop();
        }
        //System.out.println();
        data.pop();
    }
    
    public int top() {
        return data.peek();
    }
    
    public int getMin() {
        if(minStack.empty())return 0;
        return minStack.peek();
    }
}

/**
 * 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();
 */

提交结果:

个人总结:

出了好多的问题,比如比较相等上,直接用等号是不行的,因为 Interger 是一个类,每一个 Interger 数据是一个对象,我们这样比较比较的是它们之间的引用,这是肯定不会相等的。

下次使用数组试试!或者一个栈!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值