[LeetCode]最小栈

本题的重点应该就是当栈当前的最小元素被pop的时候如何获得倒数第二小的元素,我用了两个栈来完成这个操作。s1是原栈,当有一个元素被push的时候,让他与当前最小的元素进行比较,如果push的元素小的话,则更新最小元素,且将该元素存放位置的下标保存在s2中,也就是说s2中保存的是历次的最小。当pop的时候,如果pop的元素是栈中最小的元素,则将s2的栈顶元素也一起pop。

问题链接:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/24/design/59/

这里有两个坑:

minNum初值的选取,刚开始设了0导致有用例过不去,后来用了Integer里的MAX_VALUE属性,根据别的用例来看这个选择很正确[

minNum的更新,这里我在每次pop的时候,如果pop的是最小元素,则进行一系列操作之后更新minNum,但是这里有个问题,如果进行一系列操作之后最小栈s2为空[即在操作之前s2中只有一个元素],则更新minNum的时候则会有空栈错误,所以这里要有一个if进行判断

代码:

class MinStack {
        Stack<Integer> s1 = new Stack<>();
        Stack<Integer> s2 = new Stack<>();
        int minNum =Integer.MAX_VALUE;
        /** initialize your data structure here. */
        public MinStack(){}

        public void push(int x) {
            if(x<=minNum){
                s2.push(s1.size());         //存储最小值的下标
                minNum = x;
            }
            s1.push(x);
        }

        public void pop() {
            if(s1.size()==s2.peek()+1) {                 //弹出的元素是当前栈的最小值
                s2.pop();
                if (s2.size() != 0) {
                    minNum = s1.get(s2.peek());
                }else{
                    minNum = Integer.MAX_VALUE;
                }
            }
            s1.pop();
        }

        public int top() {
            return s1.peek();
        }

        public int getMin() {
            return minNum;
        }
}

猜你喜欢

转载自blog.csdn.net/sinat_37273780/article/details/84943524