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

2024-06-08 01:12

本文主要是介绍【算法专题--栈】最小栈--高频面试题(图文详解,小白一看就会!!),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、前言

二、题目描述 

三、解题方法

 ⭐解题方法--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;
};

四、总结

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

 五、共勉

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

这篇关于【算法专题--栈】最小栈--高频面试题(图文详解,小白一看就会!!)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040835

相关文章

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s