转载摘录自http://blog.jobbole.com/106940/

问题:实现一个栈,带有出栈(pop),入栈(push),取最小元素(getMin)三个方法。要保证这三个方法的时间复杂度都是O(1)。

解决方案:

  1、设原有的栈为栈A,创建额外的栈B。用于辅助原栈A。

  2、当第一个元素入A栈时,将新元素的下标进入栈B,此时栈B的栈顶元素是栈A当前最小值的下标。

  3、每当新元素进入栈A时,比较新元素和栈A当前最小值的大小,如果小于栈A当前最小值,则让新元素的下标进入栈B,此时栈B的栈顶元素就是栈A当前最小值的下标。

  4、每当栈A有元素出栈时,如果出栈元素是栈A当前最小值,则让栈B的栈顶元素也出栈。此时栈B余下的栈顶元素所指向的,是栈A当中原本第二小的元素,代替刚才的出栈元素  成为了栈A的当前最小值。(备胎转正)

  5、当调用getMin方法的时候,直接返回栈B的栈顶所指向的栈A对应元素即可。

  %e6%9c%80%e5%b0%8f%e6%a0%88%e7%9a%84%e5%ae%9e%e7%8e%b03

 

另外在评论里面得到另外的一种解决方案:

  对于节点额外的增加一个字段,记录当前为止栈的最小值

  

package cn.com.duanyi;

public class MinStack {
	public Elem top;
	 
    /** initialize your data structure here. */
    public MinStack() {
 
    }
 
    public void push(int x) {
        if(top == null){
            top = new Elem(x, x);
        }else{
            Elem e = new Elem(x, Math.min(x,top.min));
            e.next = top;
            top = e;
        }
 
    }
 
    public void pop() {
        if(top == null)
            return;
        Elem temp = top.next;
        top.next = null;
        top = temp;
 
    }
 
    public int top() {
        if(top == null)
            return -1;
        return top.value;
    }
 
    public int getMin() {
        if(top == null)
            return -1;
        return top.min;
    }
    
    public static void main(String[] args) {
    	MinStack minStack=new MinStack();
    	minStack.push(4);
    	minStack.push(8);
    	minStack.push(3);
    	minStack.push(5);
    	minStack.push(2);
    	minStack.pop();
    	
    	System.out.println(minStack.getMin());
	}

}
class Elem{
    public int value;
    public int min;
    public Elem next;
 
    public Elem(int value, int min){
        this.value = value;
        this.min = min;
    }
}

 

posted on 2016-11-04 16:50  Achris  阅读(1932)  评论(0编辑  收藏  举报