栈--getMin(leetcode 155)

1.具有getMin功能的最小栈

要求pop,push,getMin操作的时间复杂度都是O(1)

思路

“以空间换时间”,使用辅助栈是常见的做法。

使用两个栈,stackData用于保存存到栈里的数据,stackMin用于保存当前stackData中的最小值

方法1:

  • push方法:stackData直接push,stackMin为空时,也直接push到stackMin;stackMin不为空时,比较要压入的元素和stackMin栈顶元素,如果要压入的小于或等于stackMin的栈顶,便压入stackMin,否则不压入stackMin
  • pop方法:stackData直接pop,如果要pop的元素等于stackMin的栈顶,那么stackMin也pop,否则stackMin不pop
  • getMin方法:stackMin的栈顶元素即为所求

方法2:

  • push方法:stackData直接push,stackMin为空时,也直接push到stackMin;stackMin不为空时,比较要压入的元素和stackMin栈顶元素,如果要压入的小于或等于stackMin的栈顶,便压入stackMin;否则,将stackMin的栈顶元素再压入stackMin一次
  • pop方法:两个栈都pop,return stackData pop出来的值
  • getMin方法:stackMin的栈顶元素

方法1和方法2的共同点在于所有操作的时间复杂度都是O(1),空间复杂度都是O(n).区别是:方法1压入时节省空间,弹出时费时间;方法2压入时费空间,弹出时省时间.

代码

方法1:

class MyStack{
    private Stack<Integer> stackData;
    private Stack<Integer> stackMin;

    public MyStack(){
        this.stackData = new Stack<Integer>();
        this.stackMin = new Stack<Integer>();
    }

    public void push(int newNum){
        if(this.stackMin.isEmpty()){
            this.stackMin.push(newNum);
        }else if(newNum<=this.getMin()){
            this.stackMin.push(newNum);
        }
        this.stackData.push(newNum);
    }

    public int pop(){
        if(this.stackData.isEmpty()){
            throw new RuntimeException("your stack is empty");
        }else{
            int value = this.stackData.pop();
            if(value==this.getMin()){
                this.stackMin.pop();
            }
            return value;
        }
    }

    public int getMin(){
        if(this.stackMin.isEmpty()){
            throw new RuntimeException("your stack is empty");
        }else{
            return this.stackMin.peek();
        }
    }


}

public class Main {
    public static void main(String[] args) {
        MyStack stack = new MyStack();
        stack.push(3);
        stack.push(4);
        stack.push(5);
        stack.push(1);
        stack.push(2);
        stack.push(1);
        int a = stack.getMin();
        System.out.println("ans="+a);
    }
}

方法2:

class MyStack{
    private Stack<Integer> stackData;
    private Stack<Integer> stackMin;

    public MyStack(){
        this.stackData = new Stack<Integer>();
        this.stackMin = new Stack<Integer>();
    }

    public void push(int newNum){
        if(this.stackMin.isEmpty()){
            this.stackMin.push(newNum);
        }else if(newNum<=this.getMin()){
            this.stackMin.push(newNum);
        }else{
            int newMin = this.stackMin.peek();
            this.stackMin.push(newMin);
        }
        this.stackData.push(newNum);
    }

    public int pop(){
        if(this.stackData.isEmpty()){
            throw new RuntimeException("your stack is empty");
        }else{
            this.stackMin.pop();
            return this.stackData.pop();
        }
    }

    public int getMin(){
        if(this.stackMin.isEmpty()){
            throw new RuntimeException("your stack is empty");
        }else{
            return this.stackMin.peek();
        }
    }


}

public class Main {
    public static void main(String[] args) {
        MyStack stack = new MyStack();
        stack.push(3);
        stack.push(4);
        stack.push(5);
        stack.push(1);
        stack.push(2);
        stack.push(1);
        int a = stack.getMin();
        System.out.println("ans="+a);
    }
}

出处:程序员代码面试指南

原文地址:https://www.cnblogs.com/swifthao/p/12761438.html