zoukankan      html  css  js  c++  java
  • 面试题21:包含min函数的栈

    题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。

    分析:google的一道面试题。我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。

    在栈里添加一个成员变量存放最小元素(或最小元素的位置)。每次push一个新元素进栈的时候,如果该元素比当前的最小元素还要小,则更新最小元素。

    乍一看这样思路挺好的。但仔细一想,该思路存在一个重要的问题:如果当前最小元素被pop出去,如何才能得到下一个最小元素?还想要下一个最小元素?

    注意读题:对空间复杂度没有特别的要求,完全可以借助辅助空间

    因此仅仅只添加一个成员变量存放最小元素(或最小元素的位置)是不够的。我们需要一个辅助栈。每次push一个新元素的时候,同时将最小元素(或最小元素的位置。考虑到栈元素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗)push到辅助栈中;每次pop一个元素出栈的时候,同时pop辅助栈。

    参考:剑指offer

    package test01;
    
    import java.util.Stack;
    
    public class MinStack<T> {
        private Stack<T> data;
        private Stack<T> minStack;
    
        public MinStack(){
            data = new Stack();
            minStack = new Stack();
        }
    
      //设计的min函数,peek()取栈顶元素
    public T min(){ return minStack.peek(); }
      //pop()弹出元素
    public T pop(){ minStack.pop(); return data.pop(); }   //push()压进元素
    public void push(T t){ if(data.size() == 0 ){ minStack.push(t); }else{ T minValue = min(); if(( (Comparable) t ).compareTo( minValue ) < 0) minStack.push(t); else minStack.push(minValue); } data.push(t); } public static void main(String[] args) { MinStack<Integer> ms = new MinStack<Integer>(); ms.push(4);; ms.push(3); ms.push(2); ms.push(5); ms.push(1); System.out.println("min:" + ms.min() + " pop:" +ms.pop() ); System.out.println("min:" + ms.min() + " pop:" +ms.pop() ); System.out.println("min:" + ms.min() + " pop:" +ms.pop() ); System.out.println("min:" + ms.min() + " pop:" +ms.pop() ); } }

    输出结果:

    min:1  pop:1
    min:2  pop:5
    min:2  pop:2
    min:3  pop:3

    参考:http://www.acmerblog.com/stack-with-min-5990.html

  • 相关阅读:
    CodeForces 681D Gifts by the List (树上DFS)
    UVa 12342 Tax Calculator (水题,纳税)
    CodeForces 681C Heap Operations (模拟题,优先队列)
    CodeForces 682C Alyona and the Tree (树上DFS)
    CodeForces 682B Alyona and Mex (题意水题)
    CodeForces 682A Alyona and Numbers (水题,数学)
    Virtualizing memory type
    页面跳转
    PHP Misc. 函数
    PHP 5 Math 函数
  • 原文地址:https://www.cnblogs.com/Donnnnnn/p/5809665.html
Copyright © 2011-2022 走看看