zoukankan      html  css  js  c++  java
  • 面试题:如何实现最小栈

    题目

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

    解题思路

    1. 设原有的栈叫作栈A,此时创建一个额外的“备胎”栈B,用于辅助栈A。

    2. 当第1个元素进入栈A时,让新元素也进入栈B。这个唯一的元素是栈A的当前最小值。

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

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

    5. 当调用getMin方法时,返回栈B的栈顶所存储的值,这也是栈A的最小值。
    显然,这个解法中进栈、出栈、取最小值的时间复杂度都是O(1),最坏情况空间复杂度是O(n)。

    代码实现 

    package arithmetic.com.ty.binary;
    
    import java.util.Stack;
    
    public class MinStack {
        private Stack<Integer> mainStack = new Stack<Integer>();
        private Stack<Integer> minStack = new Stack<Integer>();
    
        /**
         * 入栈操作
         * @param element 入栈的元素
         */
        public void push(int element) {
            mainStack.push(element);
            // 如果辅助栈为空,或者新元素小于或等于辅助栈栈顶,则将新元素压 入辅助栈
            if (minStack.empty() || element <= minStack.peek()) {
                minStack.push(element);
            }
        }
    
        /**
         * 出栈操作
         */
        public Integer pop() {
            // 如果出栈元素和辅助栈栈顶元素值相等,辅助栈出栈
            if (mainStack.peek().equals(minStack.peek())) {
                minStack.pop();
            }
            return mainStack.pop();
        }
    
        /**
         * 获取栈的最小元素
         */
        public int getMin() throws Exception {
            if (mainStack.empty()) {
                throw new Exception("stack is empty");
            }
            return minStack.peek();
        }
    
        public static void main(String[] args) throws Exception {
            MinStack stack = new MinStack();
            stack.push(4);
            stack.push(9);
            stack.push(7);
            stack.push(3);
            stack.push(8);
            stack.push(5);
            System.out.println(stack.getMin());
            stack.pop();
            stack.pop();
            stack.pop();
            System.out.println(stack.getMin());
        }
    }

    运行结果:

  • 相关阅读:
    容易忽视的运算符问题
    JAVA:数组,排序,查找<4>
    JAVA:类的三大特征,抽象类,接口,final关键字<3>
    JAVA:变量,数据类型,运算符,流程控制(简介)<1>
    JAVA:类,对象,成员属性,成员方法,构造方法,类变量,类方法<2>
    JAVA:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题(5)
    java静态代码块、初始化块和构造方法的执行顺序
    java面试题小全
    java中从1000万个随机数中查找出相同的10万个随机数花的最少时间
    Java数据类型总结
  • 原文地址:https://www.cnblogs.com/alimayun/p/12785206.html
Copyright © 2011-2022 走看看