【算法专题--栈】最小栈--高频面试题(图文详解,小白一看就会!!)

目录

一、前言

二、题目描述 

三、解题方法

 ⭐解题方法--1

 ⭐解题方法--2

四、总结

五、共勉


一、前言

        最小栈这道题,可以说是--栈专题--,比较经典的一道题,也是在面试中频率较高的一道题目,通常在面试中,面试官可能会要求我们写出多种解法来实现这道题目,所以大家需要对这道题目非常熟悉哦!!

二、题目描述 

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

 三、解题方法

 ⭐解题方法--1

        使用两个栈一个栈用于存储数据数据栈),另一个栈用于存储数据栈对应位置向下的最小值最小栈)。

  •  其中 数据栈为:_st          最小栈为:min_st
  •  所有 要入栈的元素都要 进入 _st 栈中
  • 当  min_st 的栈为空 或者  入栈的元素比 min_st栈顶元素小或者等于的时候,才能进入 min_st
  • 删除栈顶元素时,当栈顶元素 与 min_st栈顶元素相同时,则min_st栈顶元素也删除。若元素不相同,则min_st 的 栈顶元素不删除

例如: 【5,3,3,2,4,6,1

  •  当 5 入栈时,当前最小元素5min_st 让 5 入栈 ,此时 min_st 中元素为:【5

  • 3 入栈时,当前最小元素3min_st 让 3入栈 ,此时 min_st 中元素为:【5、3

  •  当 3 入栈时,当前最小元素3min_st 让 3入栈 ,此时 min_st 中元素为:【5、3、3

  •  当 2 入栈时,当前最小元素2min_st 让 2入栈 ,此时 min_st 中元素为:【5、3、3、2

  •   当 4 入栈时,当前最小元素2min_st 不让 4 入栈 ,此时 min_st 中元素为:【5、3、3、2

  •  当 6 入栈时,当前最小元素2min_st 不让 6 入栈 ,此时 min_st 中元素为:【5、3、3、2

  •   当 6 入栈时,当前最小元素1min_st 让 1 入栈 ,此时 min_st 中元素为:【5、3、3、2、1

 当前 取最小的元素,就可以在 min_st 的栈顶就可取到啦!,删除也是同样的原理o!

 代码:

class MinStack {
public:
    MinStack() 
    {
        // 类中 默认采用构造初始化
    }
    
    void push(int val) 
    {
        // 入栈
        _st.push(val);

        if(min_st.empty() || val<=min_st.top())
        {
            min_st.push(val);
        }
    }
    
    void pop() 
    {
        // 出栈
        if(min_st.top() == _st.top())
        {
            min_st.pop();
        }

        _st.pop();
    }
    
    int top() 
    {
        return _st.top();
    }
    
    int getMin() 
    {
        return min_st.top();
    }

    // 自定义两个栈
    stack<int> _st;    // 数据栈
    stack<int> min_st; // 最小栈 --- 辅助栈
};

 ⭐解题方法--2

解题方法--1中还会存在浪费空间

例如:{5,3,2,2,2,6,4,1,1,1}

用优化题解1中的方法:min_st:{5,3,2,2,2,1,1,1},出现了重复的2和1。

如果出现极端情况,出现了N个2,那么在min_st中也要存入N个2,浪费了大量的空间。

有什么方法解决这个问题吗?🧐

计数方法:和计数排序一样的原理。

例如:{5,3,2,2,2,6,4,1,1,1}

用一个结构体来记录:

struct val_count
{
	int _val;//记录最小值
	int _count://记录次数
};
  •  在min_st:{{5,1},{3,1},{2,3},{1,3}}——>前一个数字表示这个阶段的最小值,后面的数字表示这个阶段最小值出现的次数。

  • 直到_count减到0,才删除min_stack的栈顶元素。 
struct val_count
{
    int _val;
    int _count;
};
class MinStack {
public:
    MinStack() {}
    
    void push(int val) {
        st.push(val);
        if(min_stack.empty()||val<(min_stack.top()._val))
        {
           val_count temp={val,1};
           min_stack.push(temp);
        }
        else
        {
            if(val==(min_stack.top()._val))
            min_stack.top()._count++;
        }
    }
    
    void pop() {
        if(st.top()==min_stack.top()._val)
        {
            min_stack.top()._count--;
            if(min_stack.top()._count==0)
            min_stack.pop();
        }
        st.pop();
    }
    
    int top() {
        return st.top();
    }
    
    int getMin() {
        return min_stack.top()._val;
    }

    private:
        stack<int> st;
        stack<val_count> min_stack;
};

四、总结

   最后我们来总结一下本文所介绍的内容,本文讲解来一道力扣中有关最小栈的题目,这道题目是校招笔试面试中有关链表章节非常高频的一道题目大家下去一定要自己再画画图,分析一下,把这段代码逻辑自己实现一遍,才能更好地掌握

 五、共勉

    以下就是我对 最小栈 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对 栈专题 的理解,请持续关注我哦!!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/688770.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

码蹄集部分题目(2024OJ赛18期;并查集+ST表+贪心)

1&#x1f40b;&#x1f40b;史莱姆融合&#xff08;钻石&#xff1b;并查集&#xff09; 时间限制&#xff1a;1秒 占用内存&#xff1a;128M &#x1f41f;题目描述 &#x1f41f;题目思路 这道题目使用并查集&#xff0c;同一集合的所有元素的最顶上的祖父节点是统一的。…

SAP ABAP 创建表结构 SE11

目录 一&#xff0c;创建表 &#xff1a;T-code:SE11 二&#xff0c;编辑内容&#xff1a; 1&#xff0c;内容说明&#xff1a;必填项&#xff0c;属性&#xff1a;锁定不可更改 2&#xff0c;出荷と更新 &#xff13;&#xff0c;項目 A&#xff1a;表的第一个项目必须是…

编写程序提示用户输入一个数目(例如:100)、年利率(例如:5)以及月份数(例如:6),然后显示给定月份后账户上的钱数。

(财务应用程序:复利值)假设你每月向银行账户存 100美元&#xff0c;年利率为5%&#xff0c;那么每 月利率是 0.05/12-0.00417。 第一个月之后&#xff0c;账户上的值就变成:100*(10.00417)100.417 第二个月之后&#xff0c;账户上的值就变成(100100.417)*(10.00417)-201.252 第…

【Python报错】已解决ImportError: cannot import name ‘xxx‘

成功解决“ImportError: cannot import name ‘xxx’”错误的全面指南 一、引言 在Python编程中&#xff0c;ImportError是一种常见的异常类型&#xff0c;它通常表明Python解释器在尝试导入某个模块或模块中的某个成员时遇到了问题。当看到错误消息“ImportError: cannot imp…

解密智慧校园解决方案:赋能数字化教育的未来

在当今数字化时代&#xff0c;智慧校园解决方案正以惊人的速度改变着教育界的面貌。随着科技的快速发展&#xff0c;数字化教育已经逐渐成为现代教育的核心。智慧校园解决方案作为一个集技术、教育和创新于一体的综合性项目&#xff0c;为学校提供了许多机遇和挑战。本文将揭示…

嵌入式Linux系统中RTC应用的操作详解

第一:RTC的作用以及时间简介 “RTC”的英文全称是Reul-Time Clock,翻译过来是实时时钟芯片.实时时钟芯片是日常生活中应用最为广泛的电子器件之一,它为人们或者电子系统提供精确的实时时间,实时时钟芯片通过引脚对外提供时间读写接口,通常内部带有电池,保证在外部系统关…

width: 100%和 width: 100vw这两种写法有什么区别

width: 100%; 和 width: 100vw; 是两种不同的 CSS 写法&#xff0c;它们在实际应用中会有不同的效果。以下是这两种写法的主要区别&#xff1a; width: 100%; 定义&#xff1a;将元素的宽度设置为其包含块&#xff08;通常是父元素&#xff09;宽度的 100%。效果&#xff1a;元…

Maven核心功能依赖和构建管理

1.依赖管理和配置 Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题&#xff0c;使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中&#xff0c;避免出现版本冲突和依赖缺失等…

springboot停车微信小程序小程序-计算机毕业设计源码92714

摘 要 在信息飞速发展的今天&#xff0c;网络已成为人们重要的信息交流平台。每天都有大量的农产品需要通过网络发布&#xff0c;为此&#xff0c;本人开发了一个基于springboot停车微信小程序小程序。 对于本停车微信小程序的设计来说&#xff0c;它主要是采用后台采用java语…

Android Webview 详解

一 简介 一个基于webkit引擎、展现web页面的控件 Android 4.4前&#xff1a;Android Webview在低版本 & 高版本采用了不同的webkit版本的内核Android 4.4后&#xff1a;直接使用了Chrome内核 1.1 作用 在 Android 客户端上加载h5页面在本地 与 h5页面实现交互 & …

关于RDMA传输的基本流量控制

Basic flow control for RDMA transfers | The Geek in the Corner (wordpress.com) 文心一言 已经介绍了使用发送/接收操作和RDMA读写操作&#xff0c;那么现在是一个很好的机会来结合这两种方法的元素&#xff0c;并讨论一般的流量控制。还会稍微谈谈RDMA带有立即数据的写操…

《机器学习特征提取》

书籍&#xff1a;Building Feature Extraction with Machine Learning: Geospatial Applications 作者&#xff1a;Bharath.H. Aithal&#xff0c;Prakash P.S. 出版&#xff1a;CRC Press 书籍下载-《机器学习特征提取》这是一本面向专业人士和研究生的实用指南&#xff0c…

uniapp uni-popup内容被隐藏问题

今天开发新需求的时候发现uni-popup 过一会就被隐藏掉只留下遮罩(css被更改了)&#xff0c;作者进行了如下调试。 1.讲uni-popup放入其他节点内 失败&#xff01; 2.在生成dom后在打开 失败&#xff01; 3.uni-popup将该节点在包裹一层 然后将统计设置样式&#xff0c;v-if v-s…

selenium中, quit 和close的区别

close时 """ close和quit的区别 close关闭当前页 (只是关闭了当前) quit离开整个浏览器 &#xff08;走远了&#xff09; """ from selenium import webdriver import time# 创建浏览器驱动对象 from selenium.webdriver.co…

抢人!抢人!抢人! IT行业某岗位已经开始抢人了!

所谓抢滩鸿蒙&#xff0c;人才先行。鸿蒙系统火力全开后&#xff0c;抢人已成鸿蒙市场的主题词&#xff01; 智联招聘数据显示&#xff0c;春节后首周&#xff0c;鸿蒙相关职位数同比增长163%&#xff0c;是去年同期的2.6倍&#xff0c;2023年9-12月鸿蒙相关职位数同比增速为3…

深入理解C++多线程系列——线程基础

概念 在现代计算机中&#xff0c;多线程编程是一种强大的并发执行计数&#xff0c;允许多个线程在单个程序内部并行执行&#xff0c;提高程序的执行效率和响应速度。线程&#xff0c;作为CPU调度的最小单元&#xff0c;它被用来执行程序中的指令。一个线程是进程中的一个单一顺…

跨境电商测评自养号需要解决哪些问题?

现在做测评工作室这块的&#xff0c;真正有技术的每天单都做不过来&#xff0c;同样也滋生出很多找别人买个设备和账号就以为自己懂了&#xff0c;直接开始教学来割韭菜&#xff0c;很多人没接触过这行业&#xff0c;不知道里面的水很深&#xff0c;花了钱&#xff0c;却没有掌…

移动端 UI 风格,魅力无限

移动端 UI 风格&#xff0c;打造极致体验

在推荐四款软件卸载工具,让流氓软件无处遁形

Revo Uninstaller Revo Uninstaller是一款电脑软件、浏览器插件卸载软件&#xff0c;目前已经有了17年的历史了。可以扫描所有window用户卸载软件后的残留物&#xff0c;并及时清理&#xff0c;避免占用电脑空间。 Revo Uninstaller可以通过命令行卸载软件&#xff0c;可以快速…

ChatGPT-4o独家揭秘:全国一卷高考语文作文如何轻松斩获满分?

​一、2024年全国一卷高考 二、2018年全国一卷高考 三、2016年全国一卷高考 一、2024年全国一卷高考 技术进步的悖论&#xff1a;我们的问题真的在减少吗&#xff1f; 引言 随着互联网的普及和人工智能的应用&#xff0c;越来越多的问题能够快速得到解答。然而&#xff0c;这引…