letcode::最小栈

最小栈

设计一个支持 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.

思路

定义_min成员,记录栈中最小元素(不行)
可以定义一个_min成员,每次栈插入数据时,就更新_min。
但是如果栈删除的数据恰好是当前栈中最小的数据,_min的更新就很困难,且不论栈不允许遍历,遍历的O(N)复杂度是与题意“在常数时间内检索到最小元素的栈”相悖的。

用一个栈记录栈中最小元素
定义两个栈:_st、_minst。
_st用于正常插入、删除数据。
_minst与_st同步插入、删除,但是_minst插入、删除的数据是当前_st中的最小值。(这样做,_minst栈顶的元素即为_st中的最小值)
如下,以栈中数据是“3、4、5、1、6、1”为例。
在这里插入图片描述

_minst也可以不与_st时时刻刻同步插入删除。
_minst只需在本身为空、插入的元素小于等于原先的最小值和删除的元素等于当前的最小值时,执行插入、删除操作。
如下,以栈中数据是“3、4、5、1、6、1”为例
在这里插入图片描述

如果将_minst执行插入删除操作的条件中的“插入的元素小于等于原先的最小值”
改为“插入的元素小于原先的最小值”,且恰好下一次的操作是删除栈顶元素时,就会出现错误。
还是以栈中元素是“3、4、5、1、6、1”为例

在这里插入图片描述
这时,_minst的栈顶元素明显不是_st中的最小元素了。

代码

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;//保存栈中最小值
};

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

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

相关文章

如何简单挖掘公益SRC?

目录 1、寻找漏洞 1)谷歌语法 2)fofa 2、挖掘漏洞 3、提交报告 第一步&#xff1a;“标题”和“厂商信息”和“所属域名” 第二步&#xff1a;其它内容 第三步&#xff1a;复现步骤 0、IP域名归属证明 1、漏洞页 2、该干啥 3、注入的结果 4、上榜吉时 时间&#x…

opencv(3):控制鼠标,创建 tackbar控件

文章目录 控制鼠标相关APIsetMouseCallbackcallback TrackBar 控件cv2.createTrackbarcv2.getTrackbarPos&#xff1a; 控制鼠标相关API setMouseCallback(winname, callback, userdata)callback(event, x, y, flags, userdata) setMouseCallback 在 OpenCV 中&#xff0c;s…

主办方:上海视频媒体,多样式多渠道跨屏传播

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 一&#xff0c;邀请视频媒体参加活动发布会&#xff0c;好处多多&#xff0c;首先现场气氛会很热烈&#xff0c;主办方会很有面子&#xff0c;视频媒体不管是电视台还是视频网站&#xf…

指针学习(五)

一.函数指针数组 定义&#xff1a;函数指针放进数组中&#xff0c;就叫函数指针数组&#xff0c;准确的说&#xff0c;将一个函数的地址存到⼀个数组中 那这个数组就叫函数指针数组。 int (*pi[5])(int); 解读&#xff1a;pi先和[]结合&#xff0c;因此是数组&#xff0c;加i…

JVM:字节码文件,类的生命周期,类加载器

JVM&#xff1a;字节码文件&#xff0c;类的生命周期&#xff0c;类加载器 为什么要学这门课程 1. 初识JVM1.1. 什么是JVM1.2. JVM的功能1.3. 常见的JVM 2. 字节码文件详解2.1. Java虚拟机的组成2.2. 字节码文件的组成2.2.1. 以正确的姿势打开文…

HTML 超链接 a 标签

在 HTML 标签中&#xff0c;a 标签用于定义超链接&#xff0c;作用是从一个页面链接到另一个页面。 在 a 标签中有两个常用的属性&#xff1a; - href 属性&#xff0c;用于指定链接目标的 url 地址&#xff08;必须属性&#xff09;。当为标签应用 href 属性时&#xff0c;…

[内存泄漏][PyTorch](create_graph=True)

PyTorch保存计算图导致内存泄漏 1. 内存泄漏定义2. 问题发现背景3. github中pytorch源码关于这个问题的讨论 1. 内存泄漏定义 内存泄漏&#xff08;Memory Leak&#xff09;是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放&#xff0c;造成系统内存的浪费&#…

【2021集创赛】 RISC-V杯三等奖:基于E203 处理器的SM4算法硬件加速

杯赛题目&#xff1a;基于蜂鸟E203 RISC-V处理器内核的SoC设计 参赛要求&#xff1a;研究生组/本科生组 赛题内容&#xff1a; 基于芯来科技的开源蜂鸟E203 Demo SoC进行扩展&#xff0c;在限定的可编程逻辑平台上构建面向专用应用领域&#xff08;譬如人工智能、信息安全、工业…

应用层的地址(标识符)到底是什么?

13.《计算机网络教程&#xff1a;自顶向下方法》(2012) 作者&#xff1a;Behrouz A.Forouzan – WhiteNights Site 标签&#xff1a;《计算机网络教程&#xff1a;自顶向下方法》(2012&#xff09;作者&#xff1a;Behrouz A.Forouzan, 读书笔记 P29 套接字地址 为什么要把套…

手机,蓝牙开发板,TTL/USB模块,电脑四者之间的通讯

一,意图 通过手机蓝牙连接WeMosD1R32开发板,开发板又通过TTL转USB与电脑连接.手机通过蓝牙控制开发板上的LED灯的开,关,闪等动作,在电脑上打开串口监视工具观察其状态.也可以通过电脑上的串口监视工具来控制开发板上LED灯的动作,而在手机蓝牙监测工具中显示灯的状态. 二,原料…

美团外卖9元每周星期一开工外卖红包优惠券怎么领取?

美团外卖9元周一开工红包活动时间是什么时候&#xff1f; 美团外卖9元周一开工红包优惠券是指每周星期一可以领取的美团外卖红包优惠券&#xff0c;在美团外卖周一开工红包领取活动时间内可领取到9元周一开工美团外卖红包优惠券&#xff1b;&#xff08;温馨提醒&#xff1a;如…

【ArcGIS】批量对栅格图像按要素掩膜提取

要把一张大的栅格图裁成分省或者分县市的栅格集&#xff0c;一般是用ArcGIS里的按掩膜提取。 但是有的时候所要求的栅格集量非常大&#xff0c;所以用代码来做批量掩膜&#xff08;按字段&#xff09;会非常方便。 import arcpy , shutil , os from arcpy import env from ar…

PHP常用的数组函数

PHP是一种流行的服务器端脚本语言&#xff0c;广泛用于Web开发。数组是PHP中最重要且最常用的数据类型之一&#xff0c;它提供了许多强大的数组函数&#xff0c;用于在数组上执行各种操作。在本文中&#xff0c;我们将深入解析PHP中一些常用的数组函数&#xff0c;以便更好地理…

【C/C++笔试练习】继承和派生的概念、虚函数的概念、派生类的析构函数、纯虚函数的概念、动态编译、多态的实现、参数解析、跳石板

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;继承和派生的概念&#xff08;2&#xff09;程序分析&#xff08;3&#xff09;虚函数的概念&#xff08;4&#xff09;派生类的析构函数&#xff08;5&#xff09;纯虚函数的概念&#xff08;6&#xff09;动态编译&…

uniapp App 端 版本更新检测

function checkVersion() { var req { //升级检测数据 appid: plus.runtime.appid, version: plus.runtime.version }; const timestamp Date.parse(new Date()); config.server.query_news uni.reque…

Typora下载安装 (Mac和Windows)图文详解

目录 Windows版本 一、下载 二、安装 Mac版本 一、下载 二、安装

LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字

上一节实现了 LangChain 实现给动物取名字&#xff0c; 实际上每次给不同的动物取名字&#xff0c;还得修改源代码&#xff0c;这周就用模块化template来实现。 1. 添加promptTemplate from langchain.llms import OpenAI # 导入Langchain库中的OpenAI模块 from langchain.p…

优思学院|什么是精益生产管理?从一个生活上的故事出发来说明。

你关掉电脑&#xff0c;离开办公室。 一个小时后&#xff0c;你进入家门和孩子们在一起。 你和家人一起吃晚饭。 你的老板打电话来查看你的项目进展。 你哄孩子入睡并给他们读个故事。 作为一个负责任的父母&#xff0c;你想要与孩子们的互动时间增加并提高生活的质量&…

ChatGPT + DALL·E 3

参考链接&#xff1a; https://chat.xutongbao.top/

Linux中安装部署环境(JAVA)

目录 在Linux中安装jdk 包管理器yum安装jdk JDK安装过程中的问题 验证安装jdk 在Linux中安装tomcat 安装mysql 在Linux中安装jdk jdk在Linux中的安装方式有很多种, 这里介绍最简单的方法, 也就是包管理器方法: 包管理器yum安装jdk Linux中常见的包管理器有: yumaptp…