LeetCode155-最小栈

题目

LeetCode155-最小栈_第1张图片
LeetCode155-最小栈_第2张图片

解题

这道题本来是打算用栈然后加一个标记位,这个标记位存最小的数,但是之后发现解决不这种情况:
1、弹出以后,这个标记怎么办,没法回溯
那么就得换一个数据结构,比如额外放一个线性表,里面元素从小到大排列,原栈插入元素后同步到线性表里,弹栈时从这里相应去除掉

但是想到这样还需要很多操作,就想简化一下,如果用一个额外栈,每次入栈时:
1、比额外栈顶更小或一样的就入额外栈
2、更大就(实际更大的元素存在了原栈栈顶,弹出顺序上一定是早于那些之前的小元素的,不需要考虑这些更大元素在比它小的元素弹出后变成了最小元素)
那么弹栈时分情况:
1、如果不在额外栈顶,那么额外栈不动
2、如果在额外栈,就弹出额外栈顶
取最小就拿额外栈顶就好
LeetCode155-最小栈_第3张图片
实现的时候有一个空栈异常,这里是因为最小栈开始是空的,取不到栈顶元素
这里用==null似乎不行,看源码里是empty判断空的
LeetCode155-最小栈_第4张图片
之后输出有错误
LeetCode155-最小栈_第5张图片
因为这里写的不严谨,先弹出后进行比较
LeetCode155-最小栈_第6张图片
改后
LeetCode155-最小栈_第7张图片

之后又
LeetCode155-最小栈_第8张图片
LeetCode155-最小栈_第9张图片

这里估计还是弹栈的问题,如果先获取值,再弹,再用值比,就可以了,源码里pop实际就返回了栈顶值
LeetCode155-最小栈_第10张图片
修改后完整代码

class MinStack {
    private Stack<Integer> stack;
    private Stack<Integer> minStack;
    public MinStack() {
        this.stack = new Stack();
        this.minStack = new Stack();
    }
    public void push(int val) {
        this.stack.push(val);
        if(minStack.empty()||val<=minStack.peek()){
            minStack.push(val);
        }
    }
    public void pop() {
        int value = this.stack.pop();
        if(value==this.minStack.peek()){
            this.minStack.pop();
        }    
    }
    
    public int top() {
        int x = this.stack.peek();
        return x;
    }
    
    public int getMin() {
        int m = this.minStack.peek();
        return m;
    }
}

如此提交后
LeetCode155-最小栈_第11张图片

你可能感兴趣的:(算法题,数据结构,java,算法)