• 最小栈的实现


    转载摘录自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;
        }
    }
    
  • 相关阅读:
    jmeter jsr223脚本引用变量的问题
    apk反编译
    JS时间对像
    无缝滚动
    带详情图片轮播
    飘动文字2
    飘动的文字1
    抖动图片2
    点击图片图片上下抖动
    点击div掉下和上升
  • 原文地址:https://www.cnblogs.com/loveyixiang/p/6030920.html
Copyright © 2020-2023  润新知