Java 数据结构 最小栈的实现

在O(N)时间复杂度内找出最小值:

  1. 创建两个栈
  2. 当普通栈只有一个数据时,把该数据放入最小栈
  3. 往普通栈放入数据时,把要放入的数据和最小栈的栈顶数据相比较,若要放入的数据比最小栈的栈顶数据小,则把该数据放入最小栈
  4. 需要找栈的最小值时,直接取栈顶数据

入栈(push)操作小结:

  • 普通栈一定要放,最小栈放的原则是:
  • 最小栈为空,放
  • 若当前元素比最小栈栈顶元素小,则放

问题:如果要放的元素  等于  最小栈栈顶元素,要放吗?

答:要放

理由:这涉及到出栈(pop)操作,如果pop把最上面的-2出出去了,最小栈栈顶的-2也会出去,但是实际上普通栈内还有一个最小的值-2,但最小栈栈顶已经不是-2了

 出栈(pop)操作小结:

  • 需要判断  出栈的元素  和 最小栈栈顶的元素 是否相同,相同则最小栈也要出栈
import java.util.Stack;//最小栈代码实现
public class Minstack {public Stack<Integer> stack;public Stack<Integer> minStack1;public Minstack(){
stack=new Stack<>();
minStack1=new Stack<>();}public void push(int val){//入栈操作
stack.push(val);//由于普通栈是一定要放的if(minStack1.empty()){//如果最小栈是空的,则往里放minStack1.push(val);}else {//当最小栈不为空时,放入的元素要和最小栈的栈顶元素去比较,小于等于栈顶则放入最小栈int peekVal=minStack1.peek();//先拿到最小栈栈顶元素if(val<=peekVal){minStack1.push(val);}}}public void pop(){//出栈操作if(stack.empty()){//如果栈为空,无法出栈return;}//如果栈不为空,先判断两栈顶元素是否相同,相同则最小栈的栈顶也出出去int popVal=stack.pop();if(popVal==minStack1.peek()){minStack1.pop();}}public int top(){//获取普通栈的栈顶元素if(stack.empty()){//如果栈为空,无法出栈,此时应该要报一个异常return -1;}return stack.peek();}public int getMin(){if(minStack1.empty()){//如果栈为空,无法出栈,此时应该要报一个异常return -1;}return minStack1.peek();}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

单元测试和unittest框架(超详细总结)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;薪资嘎嘎涨 单元测试的定义 1. 什么是单元测试&#xff1f; 单元测试是指&#xff0c;对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作&am…

上手一个RGBD深度相机:从原理到实践--ROS noetic+Astra S(中):RGB相机的标定和使用

前言 本教程涉及基础相机的原理&#xff0c;使用&#xff0c;标定&#xff0c;和读取。(注&#xff1a;本教程默认大家有ROS1基础&#xff0c;故不对程序进行详细解释) 上一期&#xff1a;[csdn博客]上手一个RGBD深度相机&#xff1a;从原理到实践–ROS noeticAstra S&#xf…

Python 低层多线程接口_thread的用法

_thread是python标准库中的一个低层多线程API&#xff0c;可以在进程中启动线程来处理任务&#xff0c;并且提供了简单的锁机制来控制共享资源的同步访问。本文就_thread模块的用法和特性做个简单的演示。 文章目录 一、进程和线程的区别二、_thread模块的用法2.1 派生线程2.2…

ElasticsearchRestTemplate DSL日志打印

ElasticsearchRestTemplate DSL日志打印 痛点解决方案打印基础文档查询信息打印最终DML语句 痛点 在使用 ElasticsearchRestTemplate 进行数据操作时&#xff0c;经常遇到的一个问题是线上问题排查困难。具体来说&#xff0c;在线上环境中&#xff0c;当出现问题时&#xff0c…

vue项目中——如何用echarts实现动态水球图

有时候UI的脑洞真的很大&#xff0c;总是设计出一些稀奇古怪的图形&#xff0c;但又不得不佩服他们的审美&#xff0c;确实还挺好看的。今天给大家介绍echarts如何实现动态水球图。如图所示&#xff1a; 实现步骤 一、引入 在vue页面中引入echarts&#xff0c;如未安装需要先…

Java面试篇基础部分-Synchronized关键字详解

Synchronized关键字用于对Java对象、方法、代码块等提供线程安全操作。Synchronized属于独占式的悲观锁机制,同时也是可重入锁。我们在使用Synchronized关键字的时候,可以保证同一时刻只有一个线程对该对象进行访问;也就是说它在同一个JVM中是线程安全的。   Java中的每个…

Golang | Leetcode Golang题解之第420题强密码检验器

题目&#xff1a; 题解&#xff1a; func strongPasswordChecker(password string) int {hasLower, hasUpper, hasDigit : 0, 0, 0for _, ch : range password {if unicode.IsLower(ch) {hasLower 1} else if unicode.IsUpper(ch) {hasUpper 1} else if unicode.IsDigit(ch)…

TLC/TK Adv学习笔记1 - Py版本+美化

Python下重点 tkinter.ttk 模块自 Tk 8.5 开始引入&#xff0c;它提供了对 Tk 风格的部件集的访问。 它还带来了一些额外好处包括在 X11 下的反锯齿字体渲染和透明化窗口&#xff08;需要有 X11 上的混合窗口管理器&#xff09;。 tkinter.ttk 的基本设计思路&#xff0c;就是…

【Python】探索 Errbot:多功能聊天机器人框架

不是旅行治愈了你&#xff0c;是你在路上放过了自己。 在当今的数字化时代&#xff0c;聊天机器人已成为企业与客户互动、提升工作效率和增加乐趣的重要工具。Errbot是一个高度可扩展的聊天机器人框架&#xff0c;它允许开发者使用Python轻松创建和定制机器人。本文将介绍Errb…

乐观锁、悲观锁及死锁

乐观锁、悲观锁 1.概念 悲观锁(悲观锁定)&#xff1a;具有强烈的独占和排他特性。在整个执行过程中&#xff0c;将处于锁定状态。悲观锁在持有数据的时候总会把资源或者数据锁住&#xff0c;这样其他线程想要请求这个资源的时候就会阻塞&#xff0c;直到等到悲观锁把资源释放为…

如何基于Flink CDC与OceanBase构建实时数仓,实现简化链路,高效排查

本文作者&#xff1a;阿里云Flink SQL负责人&#xff0c;伍翀&#xff0c;Apache Flink PMC Member & Committer 众多数据领域的专业人士都很熟悉Apache Flink&#xff0c;它作为流式计算引擎&#xff0c;流批一体&#xff0c;其核心在于其强大的分布式流数据处理能力&…

DHCP协议原理(网络协议)

DHCP简介 定义 DHCP&#xff08;动态主机配置协议&#xff09;是一种网络管理协议&#xff0c;能够自动为局域网中的每台计算机分配IP地址及其他网络配置参数&#xff0c;包括子网掩码、默认网关和DNS服务器等。这一机制极大简化了网络管理&#xff0c;尤其在大型局域网中&am…

李沐 过拟合和欠拟合【动手学深度学习v2】

模型容量 模型容量的影响 估计模型容量 难以在不同的种类算法之间比较&#xff0c;例如树模型和神经网络 给定一个模型种类&#xff0c;将有两个主要因素&#xff1a; 参数的个数参数值的选择范围 VC维 线性分类器的VC维 VC维的用处 数据复杂度 多个重要因素&#xff1a; 样…

信息安全数学基础(20)中国剩余定理

前言 信息安全数学基础中的中国剩余定理&#xff08;Chinese Remainder Theorem&#xff0c;简称CRT&#xff09;&#xff0c;又称孙子定理&#xff0c;是数论中一个重要的定理&#xff0c;主要用于求解一次同余式组。 一、背景与起源 中国剩余定理最早见于我国南北朝时期的数学…

鸿蒙小技巧

1.子调用父的方法 子组件 父组件 2.使用emitter实现孙子传爷 孙子组件 import emitter from ohos.events.emitter;let event: emitter.InnerEvent {eventId: 1,priority: emitter.EventPriority.HIGH};let eventData: emitter.EventData {data: {"state": true,…

R语言APSIM模型进阶应用与参数优化、批量模拟实践技术

随着数字农业和智慧农业的发展&#xff0c;基于过程的农业生产系统模型在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农田固碳和温室气体排放等领域扮演着越来越重要的作用。APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生…

帧率和丢帧分析实践

一、识别丢帧 1、使用AppAnalyzer检测性能问题 首先使用AppAnalyzer工具进行性能问题检测&#xff0c;AppAnalyzer是DevEco Studio中提供的检测评分工具&#xff0c;用于测试并评价HarmonyOS应用或元服务的质量&#xff0c;能快速提供评估结果和改进建议&#xff0c;当前支持的…

Visual Studio 引入外部静态库与动态库

Windows Visual Studio 引入外部静态库与动态库 1.前言 在C开发中不可避免地要在自己的项目中引入外部库&#xff08;OpenGL、OpenCV、OCC等&#xff09;&#xff0c;使用这些库都需要在项目中配置相应的属性才能正常开发编译。 2.引入 引入外部库主要引入三种文件&#xf…

C语言 | Leetcode C语言题解之第420题强密码检验器

题目&#xff1a; 题解&#xff1a; #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b))int strongPasswordChecker(char * password) {int n strlen(password);bool has_lower false, has_upper false, has_digit false;for …

高质量的翻译:应用程序可用性和成功的关键

在日益全球化的应用市场中&#xff0c;开发一款优秀的产品只是成功的一半。另一半&#xff1f;确保你的用户&#xff0c;无论他们在哪里或说什么语言&#xff0c;都能无缝理解和使用它。这就是高质量翻译的用武之地——不是事后的想法&#xff0c;而是应用程序可用性和最终成功…