最小栈

一、最小栈

155. 最小栈 leetcode链接

1.方法概述

  • 总体思想就是,初始化两个栈,一个是存放入栈元素的stack栈,另一个是存放最小元素的minStack栈。当两个初始化栈都存放了第一个元素后,再对入栈元素进行判断,在stack栈存放完第二个元素后,如果该元素比minStack的栈顶元素小就存放入minStack栈中,否则就不存入minStack中。当元素全部入栈后,minStack栈的栈顶元素就是stack栈中的最小元素。

2.具体实现

java版本方法

点击查看代码
class MinStack {

    private Stack<Integer> stack;
    private Stack<Integer> minStack;

    public MinStack(){
        stack = new Stack<>();
        minStack = new Stack<>(); 
    }
    
    public void push(int val) {
        stack.push(val);
        if(minStack.empty()){
            minStack.push(val);
        }else{
            int top = minStack.peek();
            if(val <= top){
                minStack.push(val);
            }
        }
    }
    
    public void pop() {
        int val = stack.pop();
        if(!minStack.empty()){
            int top = minStack.peek();
            if(val == top){
                minStack.pop();
            }
        }
    }
    
    public int top() {
        if(stack.empty()){
            return -1;
        }
        return stack.peek();
    }
    
    public int getMin() {
           if(minStack.empty()){
            return -1;
        }
        return minStack.peek();
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

3.要点总结

  • 本题的的要求要在常数时间内找到该最小元素也就是时间复杂度为O(1),如果只有一个栈的话最坏情况下时间复杂度是O(n)并不符合题目要求。并且如果用一个变量min存储当前最小元素,那么在stack进行pop操作后,变量min存储的值将不再是最小值。所以首先考虑使用两个栈一个用来存放最小元素,另一个存放入栈元素。
  • pop操作是在当stack栈和minStack栈的栈顶元素相等时同时弹出,否则只弹出stack栈的栈顶元素。
  • push操作时,需要注意的一点是入栈元素val不能只取小于minStack栈的栈顶元素top的值,等于情况下也需要存放入minStack栈,因为pop操作时,当是最小元素时两栈的元素是同时出的,如果不存入,则minStack栈中较stack栈中的最小元素就会缺少,可能会导致在pop操作后无法在时间复杂度为O(1)的情况下找出最小元素。
    image

仅供个人参考,欢迎批评指正!

posted @ 2022-12-29 23:24  路虽遥疾风归  阅读(242)  评论(0)    收藏  举报