设计包含min函数的栈,min,pop,push函数的时间复杂度为o(1)

253 阅读1分钟

设计思路:

最开始想到的是使用一个变量记录最小值,如果最小值弹出了,那么就要寻找新的最小值,寻找新的最小的时间复杂度就不是o(1)了。

想到可以增加一个最小值栈,在push数据的时候,和最小值栈顶的数据进行比较,如果比栈顶的数据小或者相等就压栈,如果比栈顶的元素大就丢掉。一个存储所有元素的栈和一个存储压栈过程中产生的最小值栈。这里使用了空间换时间的思想,最小值栈保证在push和pop的过程中,栈顶元素始终都是最小的。

java代码实现:


import java.util.Stack;

public class MinStack {

    private Stack  stack = new Stack();

    private  Stack minStack = new Stack();

    public void push(int ele){

        stack.push(ele);
        if(minStack.isEmpty()){
            minStack.push(ele);
        }else {
            int top = (int) minStack.peek();
            //可能再次加入最小值,也要再次加入到minStack中
            if (ele <= top) {
                minStack.push(ele);
            }
        }
    }


    public int pop() throws Exception {
        if(stack.isEmpty()){
            throw new Exception("栈为空");
        }

        int top = (int)stack.pop();
        if(top==(int)minStack.peek()){
            minStack.pop();
        }
        return top;
    }

    public int min() throws Exception {

        if (minStack.isEmpty()) {
            throw new Exception("栈为空");
        }
        return (int)minStack.peek();
    }

    //测试代码
    public  static void  main(String[] args) throws Exception {

        MinStack min =  new MinStack();
        min.push(2);
        System.out.println(min.min());
        min.push(6);
        min.push(1);
        System.out.println(min.min());
        min.push(7);
        System.out.println(min.pop());
        System.out.println(min.min());
        min.push(1);
        min.push(1);
        min.push(1);
        min.pop();
        System.out.println(min.min());
        min.pop();
        System.out.println(min.min());
        min.pop();
        System.out.println(min.min());
        min.pop();
        System.out.println(min.min());

    }
    
}

基础知识:

这道算法题的基础是栈,还有空间换时间的思想,想一次就把代码写对,也挺不容易的。

我们复习一下栈的基础知识:

栈底层可以使用链表实现,也可以使用数组实现。jdk8中的栈使用了数组实现。

栈中比较重要的方法有peek,pop,push,empty。peek和pop方法要重点区分一下,peek在英文中是偷看,窥视; 眯着眼睛看的意思,只是查看栈顶元素,并不弹出栈顶元素。