最小栈[中等]

优质博文:IT-BLOG-CN

一、题目

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

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

-231 <= val <= 231 - 1
pop、topgetMin操作总是在非空栈上调用
push, pop, top, and getMin最多被调用3 * 104

二、代码

辅助栈: 对于栈,如果一个元素a在入栈时,栈里有其它的元素b, c, d,那么无论这个栈在之后经历了什么操作,只要a在栈中,b, c, d就一定在栈中,因为在a被弹出之前,b, c, d不会被弹出。因此,在操作过程中的任意一个时刻,只要栈顶的元素是a,那么我们就可以确定栈里面现在的元素一定是a, b, c, d。那么,我们可以在每个元素a入栈时把当前栈的最小值m存储起来。在这之后无论何时,如果栈顶元素是a,我们就可以直接返回存储的最小值m

按照上面的思路,我们只需要设计一个数据结构,使得每个元素a与其相应的最小值m时刻保持一一对应。因此我们可以使用一个辅助栈,与元素栈同步插入与删除,用于存储与每个元素对应的最小值。
【1】当一个元素要入栈时,我们取当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小值,将这个最小值插入辅助栈中;
【2】当一个元素要出栈时,我们把辅助栈的栈顶元素也一并弹出;
【3】在任意一个时刻,栈内元素的最小值就存储在辅助栈的栈顶元素中。

class MinStack {Deque<Integer> xStack;Deque<Integer> minStack;public MinStack() {xStack = new LinkedList<Integer>();minStack = new LinkedList<Integer>();minStack.push(Integer.MAX_VALUE);}public void push(int x) {xStack.push(x);minStack.push(Math.min(minStack.peek(), x));}public void pop() {xStack.pop();minStack.pop();}public int top() {return xStack.peek();}public int getMin() {return minStack.peek();}
}

时间复杂度: 对于题目中的所有操作,时间复杂度均为O(1)。因为栈的插入、删除与读取操作都是O(1),我们定义的每个操作最多调用栈操作两次。
空间复杂度: O(n),其中n为总操作数。最坏情况下,我们会连续插入n个元素,此时两个栈占用的空间为O(n)

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

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

相关文章

引领数据趋势:2023年最值得关注的十大ETL数据集成工具

在这个数据至上的时代&#xff0c;对于以数据为驱动的组织来说&#xff0c;建立一个信息集中的强大源头是成功的关键。众多企业依靠ETL工具来管理和理解它们的数据。 ETL&#xff0c;即提取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;、加载&…

Jenkins持续集成之修改jenkins工作目录

修改jenkins工作目录 一般不建议把工作目录放到默认的C盘&#xff0c;故可以更改到其他盘中 前置条件&#xff1a;先在其他盘中新建工作目录的文件&#xff1b;如下图 1、首先打开任务管理器&#xff0c;找到服务中的Jenkins进程 2、右击点击转到详细信息&#xff1b; 3、再右…

四大视角看EMC设计:滤波、接地、屏蔽、PCB布局

电磁干扰的主要方式是传导干扰、辐射干扰、共阻抗耦合和感应耦合。对这几种途径产生的干扰我们应采用的相应对策&#xff1a;传导采取滤波&#xff0c;辐射干扰采用屏蔽和接地等措施&#xff0c;就能够大大提高产品的抵抗电磁干扰的能力&#xff0c;也可以有效的降低对外界的电…

js模块化的好处

JavaScript模块化是将JavaScript代码分解为独立的模块或文件&#xff0c;每个模块都有自己的作用域和功能。它具有以下几个好处&#xff1a; 代码组织和可维护性&#xff1a;模块化可以帮助开发者更好地组织和管理代码。将代码分解成独立的模块&#xff0c;每个模块负责特定的功…

EPICS motor模块中SoftMotor的使用示例

本实例使用motor模块中软电机&#xff0c;通过通道访问控制另一个直流电源IOC的输出电压&#xff0c;并且回读输出电压。 此处使用的另一个IOC为&#xff1a;基于EPICS stream模块的直流电源的IOC控制程序实例-CSDN博客 1&#xff09;创建这个IOC程序目录结构&#xff0c;操作…

pnpm 安装

npm install pnpm -g 解决方案&#xff1a; 1、使用管理员的身份打开powershell, win x 2、输入 set-executionpolicy remotesigned 后按y&#xff0c;问题得到解决 其他&#xff1a; pnpm 安装完成只有&#xff0c;可设置其镜像 1、查阅当前镜像&#xff08;源&#xff09…

C++中的STL库中,容器vector的使用

vector 容器 vector 容器基本概念 vector 的数据安排以及操作方式&#xff0c;与 array 非常相似&#xff0c;两者的唯一差别在于空间的 运用的灵活性。Array 是静态空间&#xff0c;一旦配置了就不能改变&#xff0c;要换大一点或者小一 点的空间&#xff0c;可以&#…

前端开发的前世今生

现代前端开发简介 前端开发的历史CGIServer PageRIAAJAX前端组件化和工程化 现代前端开发模式前端工程化前端组件化单页应用微前端 更多相关技术游戏开发Web Assembly 小结 今天我们来稍微聊一下现代前端开发的过去和现状。 前端开发的历史 CGI 在互联网刚刚开始兴起的时代&a…

Python常用库大全及简要说明,附官方网站链接地址

文章目录 前言环境管理包管理包仓库分发构建工具交互式解析器文件日期和时间文本处理特殊文本格式处理自然语言处理文档配置命令行工具下载器图像处理OCR音频Video地理位置HTTP数据库数据库驱动ORMWeb 框架权限CMS电子商务RESTful API验证模板引擎队列搜索动态消息资源管理缓存…

HarmonyOS ArkTS与c++交互通信

一、创建Native C Module 1、右键项目->new->module 如图&#xff1a; 2、修改build-profile.json5配置 "externalNativeOptions": {"path": "./src/main/cpp/CMakeLists.txt","arguments": "-v -DOHOS_STLc_shared&quo…

Android Bitmap 使用Vukan、RenderEffect、GLSL实现模糊

文章目录 Android Bitmap 使用Vukan、RenderEffect、GLSL实现模糊使用 RenderEffect 模糊使用 Vukan 模糊使用 GLSL 模糊RS、Vukan、RenderEffect、GLSL 效率对比 Android Bitmap 使用Vukan、RenderEffect、GLSL实现模糊 本文首发地址 https://blog.csdn.net/CSqingchen/articl…

运算放大器和常见运放电路

关于运算放大器 运算放大器(Operational Amplifier), 简称运放, 是一种直流耦合, 差模输入, 单端输出(Differential-in, single-ended output)的高增益电压放大器件. 运放能产生一个比输入端电势差大数十万倍的输出电势. 因为刚发明时主要用于加减法等运算电路中, 因而得名运算…

【Java】10. 循环语句

10. 循环语句 10.1 for循环 10.2 while循环 10.3 do…while循环 退出嵌套循环&#xff1a; 可以在最外侧循环加loop:&#xff08;变量任意&#xff09;&#xff0c;然后内侧循环执行return loop;即全部跳出循环System.exit(0);停止虚拟机运行

LLM算法工程师面试题总结

一、请简述对大模型的基本原理和架构的理解。 大型语言模型如GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列是基于自注意力机制的深度学习模型&#xff0c;主要用于处理和生成人类语言。下面简要概述了它们的一些基本原理和架构特点&#xff1a; 基本原…

springboot(ssm大学生心理健康诊断专家系统 心理健康平台Java(codeLW)

springboot(ssm大学生心理健康诊断专家系统 心理健康平台Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或…

线上问题整理-ConcurrentModificationException异常

项目场景&#xff1a; 商品改价&#xff1a;商品改价中通过多线程批量处理经过 Lists.partition拆分的集合对象 问题描述 商品改价中通过多线程批量处理经过 Lists.partition拆分的集合对象&#xff0c;发现偶尔会报 java.util.ConcurrentModificationException: nullat jav…

用element-ui进行简单的商品管理

安装element-ui 项目的控制台输入npm i element-ui -S main.js import ElementUI from element-ui;//引入element-ui模块 import element-ui/lib/theme-chalk/index.css;//引入element-ui的css样式 Vue.use(ElementUI);//使用ElementUI 商品管理组件 <template><…

力扣labuladong——一刷day60

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣663. 均匀树划分二、力扣687. 最长同值路径三、力扣814. 二叉树剪枝 前言 二叉树的递归分为「遍历」和「分解问题」两种思维模式&#xff0c;这道题需要…

使用Redis实现分布式锁

说明&#xff1a;在多线程情况下&#xff0c;我们需要用到锁来控制线程对资源的访问&#xff0c;当在多线程分布式的情况下&#xff0c;如果使用synchronized (this)&#xff0c;这会在每台服务器实例上都生成一个锁对象&#xff0c;而这个锁只会对当前实例生效&#xff0c;无法…

【数字图像处理】边缘检测

边缘检测是一种图像处理技术&#xff0c;用于在图像中识别和提取物体边缘的信息&#xff0c;广泛应用于计算机视觉和图像分析领域。本文主要介绍数字图像边缘检测的基本原理&#xff0c;并记录在紫光同创 PGL22G FPGA 平台的布署与实现过程。 目录 1 边缘检测原理 2 FPGA 布署…