首页 > 其他分享 >最小栈问题

最小栈问题

时间:2024-08-13 22:59:02浏览次数:10  
标签:minStack top 元素 minst 最小 问题 最小值 push

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

实现 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.

要做出这道题目,首先要理解栈结构先进后出的性质。

对于栈来说,如果一个元素 a 在入栈时,栈里有其它的元素 b, c, d,那么无论这个栈在之后经历了什么操作,只要 a 在栈中,b, c, d 就一定在栈中,因为在 a 被弹出之前,b, c, d 不会被弹出。

因此,在操作过程中的任意一个时刻,只要栈顶的元素是 a,那么我们就可以确定栈里面现在的元素一定是 a, b, c, d。

那么,我们可以在每个元素 a 入栈时把当前栈的最小值 m 存储起来。在这之后无论何时,如果栈顶元素是 a,我们就可以直接返回存储的最小值 m。

按照上面的思路,我们只需要设计一个数据结构,使得每个元素 a 与其相应的最小值 m 时刻保持一一对应。因此我们可以使用一个辅助栈,与元素栈同步插入与删除,用于存储与每个元素对应的最小值。

当一个元素要入栈时,我们取当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小值,将这个最小值插入辅助栈中;

当一个元素要出栈时,我们把辅助栈的栈顶元素也一并弹出;

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

class MinStack {
    stack<int>_st;
    stack<int>_minst;
public:
    MinStack() {

    }
    
    void push(int val) {
        _st.push(val);
        if(_minst.empty()||_minst.top()>=val)//即使相等也要push,不然之后如果出现两个相同最小的数,就会出现问题
        {
            _minst.push(val);
        }
        
        
    }
    
    void pop() {
        if(_st.top()==_minst.top())
        {
            _minst.pop();
        }
        _st.pop();
    }
    
    int top() {
        return _st.top();
    }
    
    int getMin() {
        if(_minst.empty())
        return 0;
        else
        return _minst.top();
    }
};

标签:minStack,top,元素,minst,最小,问题,最小值,push
From: https://blog.csdn.net/2403_85903590/article/details/141175852

相关文章

  • 长度最小的子数组 滑动窗口法(双指针) 解决
    给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl,numsl+1,...,numsr-1,numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例1:输入:target=7,nums=[2,3,1,2,4,3]......
  • 【实践问题】UART通信问题解决过程
    近期开发了一项通过UART进行读写操作的功能。说起来并不难,但是实际操作起来还是遇到了不少问题,解决问题也费了一番周折。因此记录下来作为积累,也供遇到类似问题的同学参考。问题背景当前的项目需要开发一项功能:BMC通过UART串口与另一设备通信,进行读写操作。听起来并不难,......
  • 最小生成树
    最小生成树Kruskal时间复杂度\(O(m\logm)\)。把所有边从小到大排序,依次考虑,对于边\((u,v)\),如果\(u,v\)已经属于一个连通块(并查集维护),加入边\((u,v)\),否则不加。Prim用优先队列优化,时间复杂度\(O((n+m)\logn)\)。比Kruskal好写,而且在稠密图上时间复杂度更优。维......
  • golang 管道channel相关问题
    一funcmain(){ c1:=make(chanany) <-c1}上面代码运行肯定会报deadlock的死锁错误,但是下面这样,如果有一个协程一直在运行,则不会报错,大致就是因为协程还在运行,所属主协程main不确定是否会往管道c1中写数据,所以就会一直阻塞在这里,上面的代码块或者没有一直执行的协程......
  • 关于渗透测试靶场搭建的问题(小白经验)
    前言可能会有点啰嗦可以跳过我唠叨的环节,在我学习网络安全的过程中我遇到的问题总是多到离谱可以说比一般人多所以我比较的有点自信做这篇文章总结,当然文章末尾有整合资源懒人就直接拿吧,如果有不对的地方请毫不保留的指出谢谢——————————————————————......
  • inscode的会员计划的python环境问题【版本3.9.16】无法升级python
    购买了inscode的会员计划后,部署python项目遇到python环境无法升级的问题inscode的会员计划的环境是3.9.16,但是项目用的例子需要3.10以上的版本,最终本人也无法完全解决,虽然手动安装了python3.10,一切都可以实现,但是最后环境自动恢复到3.9版本,导致自己手动配置的全废了,本帖子......
  • Java解决递归造成的堆栈溢出问题
    在Java中,递归造成的堆栈溢出问题通常是因为递归调用的深度过大,导致调用栈空间不足。解决这类问题的一种常见方法是使用非递归的方式重写算法,即使用迭代替代递归。1.方法一:非递归的方式重写算法(迭代替代递归)下面通过一个典型的递归例子——计算斐波那契数列的第n项,来演示如何用迭......
  • 通过这五个问题,带你深入了解中国式报表
    一、什么是中国式报表?中国式报表,顾名思义具有中国特色的报表,通常指的是中国企业/机构在财务和业务报告方面的特有风格和规范。 二、中国式报表有什么特点?一句话就可以概括中国式报表:结构复杂、数据量大的一种报表。  ·格式复杂:为了能够展示更为详尽的数据分类和汇总信......
  • unity2022.3.9+Pico更换渲染管线后打包,人物材质不可显示问题
    为了解决字体和场景闪烁问题吗,更换渲染管线旧项目管线是URP 新的项目管线是内置管线buildin()  内置管线需要设置两个地方,可以解决人物材质不显示问题1.PICO-StereoRenderingMode选择 MultiPass模式 2,Player-OtherSetting-AutoGraphicsAPI勾选(注:项目中有......
  • windows系统配置nginx环境运行pbootcms访问首页直接404的问题
    安装pbootcms后访问后台/admin.php可以,但是直接访问首页就404。运行环境运行环境采用的是:windows+nginx+php的环境详细经过客户说伪静态规则一直无法生效,看了一下,代码放到服务器除了后台/admin.php可以访问到,其他页面都是404错误,一直各种尝试导入伪静态,但是所有页面依然是404。......