LeetCode 155题解 | 最小栈

最小栈

  • 一、题目链接
  • 二、题目
  • 三、算法原理
    • 思路1:用一个变量存储最小元素
    • 思路2:双栈普通栈和最小栈
  • 四、编写代码
  • 五、时间复杂度

一、题目链接

最小栈

二、题目

在这里插入图片描述

三、算法原理

栈用数组、链表实现都行,最主要的就是在能在常数时间内检索到最小元素的栈,说明getMin是O(1)的接口。

思路1:用一个变量存储最小元素

用一个变量存储最小元素,push一个值就比较一下并且要判断是否要更新最小元素。但是若更新后再pop一下就会出问题,此时栈中最小元素也会发生改变,那么怎么更新呢?更新成什么数呢?遍历一遍栈吗,这样就是O(n)的接口了,与O(1)不符。

在这里插入图片描述

思路2:双栈普通栈和最小栈

采用双栈的方式来实现:普通栈(正常存取数据)和最小栈。

最小栈:若向普通栈中push的元素大于当前最小栈中的栈顶元素,就不用往最小栈中push;若向普通栈中push的元素小于等于当前最小栈中的栈顶元素或者最小栈为空,就向最小栈中push;getMin获取最小栈中的栈顶元素即可。

在这里插入图片描述

若再push一个与最小元素相等的元素,那么最小栈中是否也要push呢?—— 要。若没有push,普通栈pop元素-1,此时pop了最小元素,要更新最小值最小栈也pop了,此时最小值理应还是-1而不是1。所以,push的元素比最小栈栈顶元素小或相等,minst都要push这个元素。

在这里插入图片描述

当前栈中最小元素是-1,若pop元素7后,最小元素还是-1,此时最小栈不用动。若再pop,此时删除的元素与最小栈中的栈顶元素相等,那么这时最小栈要pop,这时getMin就是1:

在这里插入图片描述

不需要写构造、析构、拷贝构造、赋值。类的两个成员变量是自定义类型的,不写构造,编译器自动生成的默认构造会自动调用两个成员变量的默认构造,拷贝构造、析构、赋值同理。

private:stack<int> _st;stack<int> _minst;

构造函数,像这样啥也不写或直接为空都是可以的:

在这里插入图片描述

因为显示写构造了,编译器就不会生成默认构造了。显示写构造,不管有没有写初始化列表,一个类都有初始化列表的。没有显示写初始化列表且没有给缺省值,对于自定义类型的成员会调用它的默认构造。

封装:
封装的简单形态:数据和方法放到类里面,想被看到的封装成公有,不想被看到的封装成私有。
另一层封装的体现:无需关心比如说像这道题的栈的底层是怎么实现的,就只管怎么用即可,知道了功能直接调用对应的功能。

四、编写代码

class MinStack {
public:MinStack(){}void push(int val) {_st.push(val);if (_minst.empty() || val <= _minst.top()) _minst.push(val);}void pop() {if (_st.top() == _minst.top()) _minst.pop();_st.pop();}int top() {return _st.top();}int getMin() {return _minst.top();}
private:stack<int> _st;stack<int> _minst;
};/*** Your MinStack object will be instantiated and called as such:* MinStack* obj = new MinStack();* obj->push(val);* obj->pop();* int param_3 = obj->top();* int param_4 = obj->getMin();*/

五、时间复杂度

所有接口的时间复杂度都是O(1)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

es+kibana---集群部署

其实一般es要跑3个节点的&#xff0c;这样才能做高可用&#xff0c;处理并发大&#xff0c;但是我这里只是一个pod mkdir -p /stroe/data/es es搭建&#xff1a; #【拉取镜像】 #docker pull elasticsearch:6.8.7 #docker pull busybox:1.28 【导入镜像】 docker load -i es.…

WPF常用技巧汇总 - Part 2

WPF常用技巧汇总-CSDN博客 主要用于记录工作中发现的一些问题和常见的解决方法。 目录 WPF常用技巧汇总-CSDN博客 1. DataGrid Tooltip - Multiple 2. DataGrid Tooltip - Cell值和ToolTip值一样 3. DataGrid Tooltip - Cell值和ToolTip值不一样 4. DataGrid - Ctrl A /…

uniapp打包apk如何实现版本更新

我们做的比较简单&#xff0c;在后端设置版本号&#xff0c;并在uniapp的config.js中定义版本号&#xff0c;每次跟后端的进行对比&#xff0c;不一致的话就更新。 一、下载apk 主要代码&#xff08;下载安装包&#xff0c;并进行安装&#xff0c;一般得手动同意安装&#xf…

局部和整体的关系

Prompt&#xff1a;为什么要研究局部和整体的关系呢&#xff1f;是因为很多情况下&#xff0c;局部就能表达出整体&#xff1f; 这是一个非常本质的问题&#xff0c;其实你已经接近数学和物理中“几何本质”的核心了。我们研究局部和整体的关系&#xff0c;是因为&#xff1a;…

企业办公协同平台安全一体化生态入住技术架构与接口标准分析报告

全球组织数字化与智能化背景下 企业办公协同平台安全一体化生态入住技术架构与接口标准分析报告 一、背景与市场需求 市场规模与增量 根据Statista数据&#xff0c;全球协同办公平台市场规模预计从2023年的$480亿增长至2027年的$900亿&#xff0c;年复合增长率&#xff08;CAG…

【2025最新面试八股常问知识点】HTTP1.0,HTTP1.1,HTTP2.0,HTTP3.0,HTTP的进化之路。

HTTP 超文本传输协议&#xff08;英文&#xff1a;HyperText Transfer Protocol&#xff0c;缩写&#xff1a;HTTP&#xff09;是一种用于分布式、协作式和超媒体信息系统的应用层协议。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的…

【算法练习】归并排序和归并分治

文章目录 1.归并排序1.1 递归版本1.2 非递归版本 2.归并分治2.1 计算数组的小和2.2 计算翻转对 1.归并排序 归并排序的核心步骤是&#xff1a; 拆分&#xff1a;将无序数组不断对半拆分成小块&#xff0c;直到每个小块只剩一个元素&#xff08;自然有序&#xff09;。 合并&a…

域对齐是什么

域对齐&#xff08;Domain Alignment&#xff09;是在机器学习和计算机视觉等领域中常用的技术 定义 域对齐旨在将不同域&#xff08;Domain&#xff09;的数据映射到一个共同的特征空间中&#xff0c;使得来自不同域的数据在该空间中具有相似的分布。这里的“域”可以指代不…

【linux】git安装、升级

git安装、升级 一、快捷安装版本2.18.0二、自定义版本安装&#xff08;安装、升级&#xff09;1、移除旧文件2、安装所需依赖3、选择指定版本4、解压文件、编译5、增加环境变量&#xff0c;验证是否版本 三、升级 一、快捷安装版本2.18.0 yum install git git --version二、自…

编程日志4.24

栈的链表基础表示结构 #include<iostream> #include<stdexcept> using namespace std; //模板声明&#xff0c;表明Stack类是一个通用的模板&#xff0c;可以用于存储任何类型的元素T template<typename T> //栈的声明 //Stack类的声明&#xff0c;表示一…

《冰雪传奇点卡版》:探索冰雪世界的传奇旅程!

《冰雪传奇点卡版》以“纯净打金”为核心&#xff0c;摒弃复杂付费坑&#xff0c;回归经典传奇玩法。以下从核心玩法、资源获取、职业搭配、交易变现四维度展开&#xff0c;助你高效开启冰雪传奇之旅。 一、核玩法解析&#xff1a;如何高效获取资源&#xff1f; 1. 职业定位与…

DeepClaude开源程序可以实现代码生成、创作诗句以及内容创作等功能

一、软件介绍 文末提供程序和源码下载 DeepClaude开源程序是增强的 AI&#xff0c;可以实现代码生成&#xff1a;DeepSeek r1 Claude 3.7 十四行诗 - 无与伦比的性能&#xff01;内容创作&#xff1a;DeepSeek r1 Gemini 2.5 Pro - 卓越的质量&#xff01;OpenAI 兼容。流媒…

Java常用注解通俗解释

注解就像是给Java代码贴的"便利贴"&#xff0c;它们不会改变代码本身的逻辑&#xff0c;但能给编译器、开发工具或运行时环境提供额外信息。下面我用最通俗的方式解释Java中最常用的注解&#xff1a; 一、基础篇&#xff1a;人人必知的注解 1. Override - "我…

vscode chrome调试怎么在所有浏览器都好使

chrome调试时只能在打开的浏览器里进行调试&#xff0c;其它打开的chrome浏览器就不能调试了&#xff0c;怎么解决。 右键点击 Chrome 的快捷方式图标&#xff0c;选择属性 在目标一栏&#xff0c;最后加上--remote-debugging-port9222 注意要用空格隔开 lanch.json 文件配置 …

Unity PBR基础知识

PBR原理 基于物理的渲染&#xff08;Physically Based Rendering&#xff0c;PBR&#xff09;是指使用基于物理原理和微平面理论建模的着色/光照模型&#xff0c;以及使用从现实中测量的表面参数来准确表示真实世界材质的渲染理念。 PBR基础理念 微平面理论&#xff08;Micr…

COM组件使用方法

普通COM组件&#xff08;如DLL&#xff09;仅暴露方法/属性接口&#xff0c;而ActiveX控件&#xff08;如OCX&#xff09;需要可视化交互&#xff08;如按钮、表格&#xff09;&#xff0c;需通过 ​​AxInterop​​ 包装器实现宿主环境集成。 项目中引入ActiveX控件流程如下。…

在 Spring Boot 项目中如何使用索引来优化 SQL 查询?

在 Spring Boot 项目中使用索引来优化 SQL 查询是提升数据库性能最常用的方法之一。下面是详细的步骤和实践指南&#xff1a; 核心目标&#xff1a;让数据库能够通过扫描索引&#xff08;小范围、有序的数据结构&#xff09;快速定位到所需数据行&#xff0c;而不是扫描整个表…

Vue3生产环境与Vue Devtools

在 Vue 3 的生产环境中&#xff0c;默认情况下 Vue Devtools 是无法正常使用 的&#xff0c;但开发者可以通过配置强制启用。以下是关键信息总结&#xff1a; &#x1f4cc; 核心结论 默认不可用 Vue 3 生产构建会移除 Devtools 支持以优化性能和安全性。 可强制启用 通过构建…

ARP渗透学习1

ARP协议工作原理 1. 什么是ARP ARP定义: 地址解析协议&#xff08;Address Resolution Protocol&#xff09;&#xff0c;是根据IP地址获取物理地址的一个TCP/IP协议。 2. 工作原理 ARP表: 每台计算机都需要一个ARP表&#xff0c;用来保存IP地址和MAC地址的映射关系。查询过…

甲骨文云2025深度解析:AI驱动的云原生生态与全球化突围

一、战略转型&#xff1a;从数据库巨头到AI云服务先锋 1. 技术重心向AI与云深度迁移 甲骨文在2025年加速向AI原生云架构转型&#xff0c;其核心战略围绕生成式AI与量子计算展开。通过推出Oracle 23ai自治数据库&#xff0c;深度集成AI向量搜索功能&#xff0c;并重构云基础设…