算法---栈的最小值

2023-11-16

实现一个这样的栈,这个栈除了可以进行普通的push、pop操作以外,还可以进行getMin的操作,getMin方法被调用后,会返回当前栈的最小值。栈里面存放的都是 int 整数,并且数值的范围是 [-100000, 100000]。要求所有操作的时间复杂度是 O(1)。附加:如果空间复杂度也能O(1)的话可加分。

一、时间 O(1) + 空间 O(n)
这个要求其实也不难,我们可以用一个辅助栈来存放最小值。例如我们有两个栈 stack 和 helper,stack 是目标栈,helper 是辅助栈,用来存放最小值。每次 getMin 的时候,直接从 helper 栈顶获取即可。下面重点讲一下 push 操作。

每次进行 push 操作的时候,进行如下操作(假设要 push 的元素是 t)

1、对于 stack 栈,我们按照正常情况把元素 push 到栈顶就可以了。

2、然后要把元素 t push 到 helper 栈顶的时候,要先把 t 与 helper 栈顶的元素(假设是 a)进行比较,如果 t <= a,则把元素 t push 到 helper 的栈顶,如果 t > a,这个时候,我们不把 t push 进去,而是重复把 a push 到 helper 的栈顶。

我举个例子吧,例如我们要把数组 arr = {2, 1, 3} 都放入栈中,则存放过程如下:

1、首先 push 2。由于刚开始 stack 和 helper 都是空的,所以直接把 2 放入,此时目标栈和辅助栈的值如下:stack = {2},helper = {2}。

2、接下来 push 1。由于 helper 栈顶元素比 1 大,所以直接把 1 放入 helper 的栈顶,此时:stack = {2, 1},helper = {2, 1}。

3、接下来 push 3,由于 helper 栈顶元素比 3 小,所以重复把 栈顶的元素再次入栈,此时:stack = {2, 1, 3},helper = {2, 1, 1}。

对于 pop 操作,直接把两个栈的栈顶元素删除即可,所以具体代码如下:
 

public class MinValStack {
    private static Stack<Integer> stack = new Stack<>();
    private static Stack<Integer> helper = new Stack<>();

    public static void push(Integer data) {
        stack.push(data);
        if (helper.isEmpty() || data < helper.peek()) {
            helper.push(data);
        } else {
            helper.push(helper.peek());
        }
    }

    public static Integer pop() {
        if (stack.isEmpty()) {
            return null;
        }
        helper.pop();
        return stack.pop();
    }

    public static Integer getMin() {
        return helper.isEmpty() ? null : helper.peek();
    }

}

二、时间 O(1) + 空间 O(1) 

这种方法的话,我们的 stack 栈中,不能存放原始数值,而是应该存放 差值,啥差值?就是存放栈顶与最小值的差值。我还是详细一点给大家讲一个案例吧,案例配合代码,应该还是挺好理解的,例如 arr = {2, 1, 3, 0},那么把这些元素入栈时,stack 栈中元素以及最小值的变化如下


上面表格是 push 时,栈中数值的变化,然后再进行 getMin 和 pop 可以通过相应的判断获取,直接看我的代码实现吧,我会进行相应解释,挺好懂,代码如下:

注意:少了一行代码

pop方法里当top<=0时:

if(top<=0){

int result=min;

min=min+compare;

 return result;

}
 

public class MinValStackBestSolution {
    private static Stack<Integer> stack = new Stack<>();
    private int min;

    public void push(int data) {
        if (stack.isEmpty()) {
            min = data;
            stack.push(0);
        } else {
            int compare = data - min;
            stack.push(compare); //存放和最小值的差值
            min = compare < 0 ? data : min;
        }
    }

    public int pop() {
        int top = stack.pop();
        if (top <= 0) { //如果栈顶元素<0,返回最小值min
            return min;
        } else {//如果栈顶元素>0,返回min+top
            return min + top;
        }
    }

    public int getMin() {
        return min;
    }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法---栈的最小值 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 如何将 pfx 文件转换为 jks,然后通过使用 wsdl 生成的类来使用它来签署传出的肥皂请求

    我正在寻找一个代码示例 该示例演示如何使用 PFX 证书通过 SSL 访问安全 Web 服务 我有证书及其密码 我首先使用下面提到的命令创建一个 KeyStore 实例 keytool importkeystore destkeystore
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • Java项目本地访问resource目录文件运行正常,打包成jar后提示没有那个文件目录

    本地获取方法代码入下 这种方式得到的路径 打包成jar后会访问不到这个路径 this getClass getClassLoader getResource FONT PATH getPath usr local api fxq contr
  • Android开发环境的搭建

    Android开发环境的搭建 在开始Android开发之旅启动之前 首先要搭建环境 然后创建一个简单的HelloWorld 本文的主题如下 1 环境搭建 1 1 JDK安装 1 2 Eclipse安装 1 3 Android SDK安装 1
  • 生于1999年的11家互联网公司:为何唯独阿里巴巴化茧成蝶?

    1999年 是中国互联网发展史上颇具传奇性的一年 这一年 QQ的前身OICQ横空出世 搜狐和张朝阳风头正劲 李彦宏辞职回京创业 李国庆创立当当 陈天桥创立盛大 马云创立了阿里巴巴 同一起跑线之下 还有携程 中华网 易趣 天涯社区 8848
  • Map 转化为数组

    含义 Map 数据结构类似于对象 也是键值对的集合 但是键的范围不限于字符串 各种类型的值 包括对象 都可以当做键 Map 结构提供了 值 值 的对应 是更完善的 Hash 结构实现 Map 可以作为构造函数 新建 Map new Map
  • python distutils、setuptools打包第三方库

    1 项目目录 src 引用时的包名 可随意修改 http 子类包名 可随意修改 init py xxx py init py xxx py readme md setup py 打包信息 例如上命名方式 打包后引用时为 import src
  • 如何在 Python 中终止 Windows 上运行的进程?

    当深入研究Windows操作系统上的Python开发领域时 无疑会出现需要终止正在运行的进程的情况 这种终止背后的动机可能涵盖多种情况 包括无响应 过度资源消耗或仅仅是停止脚本执行的必要性 在这篇综合性的文章中 我们将探讨各种方法来完成使用
  • 算法二分查找之第一个错误的版本

    java方法 The isBadVersion API is defined in the parent class VersionControl boolean isBadVersion int version public class
  • P-tuning v2 利用深度提示调优

    P tuning v2 利用深度提示调优 即对预训练变压器的每一层输入应用连续提示 Deep prompt tuning 增加了连续提示的能力 并缩小了跨各种设置进行微调的差距 特别是对于小型模型和艰巨的任务 感谢 rainatam 为发布
  • 网络数据保障ptop_智能IP网络,引领广域网进入全业务智能时代

    当前 伴随数字化的浪潮 各行各业都在加速数字化探索和转型 对企业而言 数字化转型的根本是通过对业务模式 业务流程 企业组织的改造 让所有的业务能够基于数据进行驱动 实现更好的客户体验和更高的组织效能 从而推动业务的增长 企业数字化转型的终极
  • 在 BSV 上构建机器学习竞赛市场

    我们提出了一种在 BSV 上实现去中心化机器学习 ML 市场的新方法 任何人都可以通过发布附带奖励的智能合约来外包机器学习任务 任何提交表现最佳模型的人都将通过区块链交易获得奖励 而无需通过中心化机构 如何在 BSV 上进行机器学习竞赛 K
  • 1.2 管理 NetBackup 许可证

    关于管理 NetBackup 许可证 NetBackup许可证密钥是在安装软件时添加的 对于需要单独购买的选件 可以稍 后在 许可证密钥 对话框中添加许可证 注意 在进行任何许可证更新之后 请重新启动 NetBackup 管理控制台 注意
  • Fedora 18 安装VMware Tools

    1 宿主机 windows 8 4G内存 2 虚拟机 VMware 9 0 1 3 虚拟主机 VMware下Fedora 18 1G内存 VMware Tools是VMware虚拟机中自带的一种增强工具 相当于 VirtualBox 中的增
  • ipv6文件服务器,ipv6怎么配置服务器

    ipv6怎么配置服务器 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 IPv6的使用 可以有效弥补IPv4网络地址资源有
  • StrongSORT(deepsort强化版)浅实战+代码解析

    1 实战部分 1 1 具体操作 其实和之前的deepsort没差 到github上下载Yolov5 StrongSORT OSNet 下载对应的yolov5去替代原文件中yolov5 下载yolov5权重 可以自动下载 和ReID权重 可能
  • (Java 基础知识) Java 正则表达式

    一 概述 正则表达式是Java处理字符串 文本的重要工具 Java对正则表达式的处理集中在以下两个两个类 java util regex Matcher 模式类 用来表示一个编译过的正则表达式 java util regex Pattern
  • 编译原理三大经典书籍(龙书 虎书 鲸书)

    1 龙书 Dragon book 英文名 Compilers Principles Techniques and Tools 作者 Alfred V Aho Ravi Sethi Jeffrey D Ullman 中文名 编译原理技术和工具
  • 《python语言程序设计》第5章第10题 里EOFError:EOF when reading a line? 问题的解决(小白分享)

    废话不多说上题 编写程序提示用户输入学生个数以及每个学生的分数 然后显示最高分 假设输入是存储在一个名为score txt的文件 程序从这个文件获取输入 codeNumber eval input Enter class input 输入学
  • 位运算的那些奇技淫巧

    这里写目录标题 一 常 装 见 逼 的位操作 先看几个有意思的位操作 1 判断奇数偶数 2 交换两个数字 3 找出没有重复的数字 4 m的n次方 5 判断一个数是不是二的指数 6 找出不大于N的最大2的幂指数 二 leetcode解题 13
  • LINQ语句查询

    连接数据库 Linq语句查询 目前的学习进度来说也就是我们的单表和多表查询 它为匿名类型查询提供了一种很方便的方法 可用来将一组只读属性封装到单个对象中 而且还不需要先定义一个显示类型 因为它的类型名字直接由编译器生成 而且每一个属性的类型
  • 算法---栈的最小值

    实现一个这样的栈 这个栈除了可以进行普通的push pop操作以外 还可以进行getMin的操作 getMin方法被调用后 会返回当前栈的最小值 栈里面存放的都是 int 整数 并且数值的范围是 100000 100000 要求所有操作的时