• LeetCode-155. 最小栈(C++)



    一、题目描述

    设计一个支持 pushpoptop 操作,并能在常数时间内检索到最小元素的栈。

    实现 MinStack 类:

    • MinStack() 初始化堆栈对象。
    • void push(int val) 将元素val推入堆栈。
    • void pop() 删除堆栈顶部的元素。
    • int top() 获取堆栈顶部的元素。
    • int getMin() 获取堆栈中的最小元素。

    二、示例与提示

    示例 1:

    输入:
    [“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”]
    [[],[-2],[0],[-3],[],[],[],[]]
    输出:
    [null,null,null,null,-3,null,0,-2]
    解释:
    MinStack minStack = new MinStack();
    minStack.push(-2);
    minStack.push(0);
    minStack.push(-3);
    minStack.getMin(); --> 返回 -3.
    minStack.pop();
    minStack.top(); --> 返回 0.
    minStack.getMin(); --> 返回 -2.

    提示

    • -231 <= val <= 231 - 1
    • poptopgetMin 操作总是在 非空栈 上调用
    • push, pop, top, and getMin最多被调用 3 * 104

    三、思路

    一开始会把本题想简单了,用一个变量记录最小值即可解决问题,后来发现如果要是弹出了这个最小值的话,我们还要记录次小值,若再弹出次小值的话,我们又要记录次次小值,这样下去可能要记录整个栈中的所有数。

    再审一次题,题目要求我们设计一个能在常数时间内检索到最小元素的栈,所以我们绝不能在需要最小值的时候,再做排序、查找等操作来获取最小值


    因此,我们可以创建两个栈,一个栈是主栈 stack,另一个是辅助栈 minStack,与主栈同步插入与删除,用于存放对应主栈不同时期的最小值

    1. 当一个元素要入栈时,我们取当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小值,将这个最小值push辅助栈
    2. 当一个元素要出栈时,我们把辅助栈的栈顶元素也一并弹出

    这样, 在任意一个时刻,主栈内元素的最小值就存储在辅助栈的栈顶元素中。

    四、代码

    class MinStack {
    public:
        stack<int>st;
        stack<int>min_st;
        // 注意:需要先向辅助栈中push一个最大值,以便后续向栈中push最小值
        MinStack() {
            min_st.push(INT_MAX);
        }
        
        void push(int val) {
            // 入栈需要比较出辅助栈栈顶与当前元素的最小值放入辅助栈中
            st.push(val);
            min_st.push(min(val, min_st.top()));
        }
        
        void pop() {
        	// 出栈需要把辅助栈的栈顶元素也一并弹出
            st.pop();
            min_st.pop();
        }
        
        int top() {
            return st.top();
        }
        
        int getMin() {
            return min_st.top();
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    复杂度分析

    时间复杂度: O(1)

  • 相关阅读:
    负载均衡原理分析与源码解读
    CSS的弹性布局
    Briefings in bioinformatics2022 | Knowledge-based BERT+:像计算化学家一样提取分子性质的方法
    力扣每日一题2022-09-07简单题:重新排列单词间的空格
    uniapp uni-combox 数据源使用对象,选择后获取对应项的ID,可指定自定义的balbel,value
    六年 Java 老鸟,写给 1-3 年程序员的几点建议,满满硬货指导
    Apache Hive 入门
    如何將人臉變漂亮(七)
    孩子们的游戏(圆圈中最后剩下的数)(C++)
    在树莓派上搭建属于自己的网页(3)
  • 原文地址:https://blog.csdn.net/m0_74002634/article/details/134372054