面试题---push,pop,min复杂度都为常数的stack

来源:互联网 发布:企业数据分析 编辑:程序博客网 时间:2024/05/15 23:48

面试题 -- 设计包含min函数的栈

要求:

min函数用来得到栈的最小元素

函数min,push,pop时间复杂度都是O(1)


难点在于如何保存min值,并且当min值出栈后,如何快速得到新的min值,用一个包含当前元素值和前后最小元素值的复合结构可以解决

直接上代码

public class MinStack<T extends Comparable> {    int size;    int top = 0;    Node<T>[] arr;    public MinStack(int size) {        this.size = size;        arr = new Node[size];    }    public void push(T t) {        if (top + 1 == size)            throw new IllegalArgumentException("it's full");        Node<T> n = new Node<T>(t);        if (top != 0) {            if (t.compareTo(arr[top - 1].getMin()) > 0)                n.setMin(arr[top - 1].getMin());        }        arr[top++] = n;    }    public T pop() {        if (top == 0)            throw new IllegalArgumentException("it's empty");        return arr[--top].getT();    }    public T min() {        return top == 0 ? null : arr[top - 1].getMin();    }    class Node<T> {        private final T t;        private T min;        public Node(T t) {            this.t = min = t;        }        public T getT() {            return t;        }        public T getMin() {            return min;        }        public void setMin(T min) {            this.min = min;        }    }}
测试一下
        MinStack<Integer> msi = new MinStack<Integer>(10);        msi.push(10);        msi.push(11);        msi.push(15);        msi.push(2);        msi.push(4);        msi.push(1);        msi.push(9);        msi.push(8);        msi.push(7);        System.out.println(msi.min());        msi.pop();        msi.pop();        msi.pop();        msi.pop();        msi.pop();        msi.pop();        System.out.println(msi.min());

结果输出

110
满足要求!

结合这个例子可以用一个图看到算法的过程


原创粉丝点击