zoukankan      html  css  js  c++  java
  • 最小栈

    题目链接:

    涉及知识:

    题目要求:通过已学的数据结构实现一个最小栈,可以实现 push、pop、top 和 getMin ,分别表示入栈、出栈、返回栈顶元素和返回当前栈中元素的最小值。并且要求 getMin 方法的时间复杂度为常数时间。

    实现思路:使用两个栈来实现。

    • 数据栈:按入栈的顺序保存元素。
    • 辅助栈:只保存比当前栈顶元素小的元素。(初始状态栈为空保存第一个元素)
    • 在出栈时,当数据栈直接出栈,辅助栈当且仅当弹出的数据栈的元素的值等于栈顶元素的值的时候才出栈。

    为什么辅助栈入栈的时候要小于等于?

    小于等于是因为可能连续入栈的多个元素相等,且是最小的,如果辅助栈中只保存一份,那么当数据栈出栈的时候,弹出若干个相等元素中的一个时,便将辅助栈中保存的值弹出,出错。

    代码实现:

    import java.util.Stack;
    
    /*
     * @lc app=leetcode.cn id=155 lang=java
     *
     * [155] 最小栈
     */
    class MinStack {
        Stack<Integer> s1 = null;
        Stack<Integer> s2 = null;
    
        /** 
         * initialize your data structure here. 
         * 使用两个栈保存数据,s1 按插入顺序保存,s2 永远保存比栈顶小的元素 
         * */
        public MinStack() {
            s1 = new Stack<>();
            s2 = new Stack<>();
        }
        
        /**
         * 添加元素
         * @param x
         */
        public void push(int x) {
            s1.push(x);
            
            //s2 为空或者 x 小于等于 s2 的栈顶元素
            if(s2.empty() || x <= s2.peek()){
                s2.push(x);
            }
        }
        
        /**
         * 弹出元素
         */
        public void pop() {
            if(!s1.empty()){
                int tmp = s1.peek();
                s1.pop();
    
                //如果 s1 将最小值弹出,则 s2 也需要同时将该值弹出
                if(tmp == s2.peek()){
                    s2.pop();
                }
            }
        }
        
        /**
         * 获取栈顶元素,但不删除
         * @return
         */
        public int top() {
            return s1.peek();
        }
        
        /**
         * 返回栈中的最小值
         * @return
         */
        public int getMin() {
            return s2.peek();
        }
    }
    
    /**
     * Your MinStack object will be instantiated and called as such:
     * MinStack obj = new MinStack();
     * obj.push(x);
     * obj.pop();
     * int param_3 = obj.top();
     * int param_4 = obj.getMin();
     */
    
  • 相关阅读:
    呵呵
    数据类型转换方法
    工业设计三原则
    C#实现的根据年月日计算星期几的函数
    网页设计的12种颜色
    SqlParameter 存储过程
    HTTP 状态响应码
    Android获取屏幕高度和宽度
    Android屏幕自适应解决方案
    Nodejs学习笔记nodejs的安装
  • 原文地址:https://www.cnblogs.com/zcxhaha/p/11393227.html
Copyright © 2011-2022 走看看