设计一个栈,支持O(1)的min方法

来源:互联网 发布:泰安知金乱收费 编辑:程序博客网 时间:2024/04/28 11:52

首先,对于栈,实现其min方法很简单,就是每次push一个值的时候,对minValue进行维护:

if(value < minVlaue){    minValue = value;}

每次调用min() 时直接返回minValue即可。但是,如果pop走的是minValue则需要遍历剩下的元素求最小值。所以这样无法满足O(1)的要求,我们需要额外的空间保存栈的每一个状态下的最小值。

正如上面陈述的,只要当push的值小于minValue时和pop的值等于minValue时才需要进行额外的操作,用额外的一个栈stackOfMin来记录最小值的情况。当push的值小于minValue时,stackOfMin push新的最小值;pop的值等于minValue时,stackOfMin也相应地pop就行。

代码

package test1;import java.util.Stack;public class StackWithMin extends Stack<Integer>{    private Stack<Integer> stackOfMin;    public StackWithMin() {        stackOfMin = new Stack<>();    }    public int min() {        if(stackOfMin.isEmpty()){            return Integer.MAX_VALUE;        }else {            return stackOfMin.peek();        }    }    @Override    public Integer push(Integer item) {        if(item < min()){            stackOfMin.push(item);        }        return super.push(item);    }    @Override    public synchronized Integer pop() {        if(this.peek() == min()){            stackOfMin.pop();        }        return super.pop();    }    public static void main(String[] args) {        StackWithMin stackWithMin = new StackWithMin();        stackWithMin.push(19);        System.out.println("The min is: "+stackWithMin.min());        stackWithMin.push(15);        System.out.println("The min is: "+stackWithMin.min());        stackWithMin.push(17);        System.out.println("The min is: "+stackWithMin.min());        stackWithMin.pop();        System.out.println("The min is: "+stackWithMin.min());        stackWithMin.pop();        System.out.println("The min is: "+stackWithMin.min());        stackWithMin.push(30);        System.out.println("The min is: "+stackWithMin.min());        stackWithMin.push(1);        System.out.println("The min is: "+stackWithMin.min());        stackWithMin.push(4);        System.out.println("The min is: "+stackWithMin.min());    }}

输出

The min is: 19The min is: 15The min is: 15The min is: 15The min is: 19The min is: 19The min is: 1The min is: 1
0 0
原创粉丝点击