Leetcode155(设计最小栈)

例题:

分析:

题目要求我们必须在常数时间内检索到最小元素。

我们可以使用两个栈(A、B)来实现,A栈用来正常存储数据、弹出数据, B栈用于存储A栈中的最小元素,如下图:

                                

刚开始, A栈没有数据, B栈先储存一个元素MAX(整数最大值)。

添加元素时:

当向栈中加入数据时,比如先加入元素 2 , 在A栈中直接存入 2, 同时新加入元素与 B栈的栈顶元素比较,把较小值加入B栈。保证在每次加入元素后,B栈的栈顶是本次的最小元素。

弹出元素时:

当弹出元素时,A栈正常弹出元素,同时B栈也要弹出元素

代码实现:
package leetcodeup;import java.util.LinkedList;public class MinStackLeetcode155 {static class MinStack {private final LinkedList<Integer> stack = new LinkedList<>();private final LinkedList<Integer> min = new LinkedList<>();public MinStack() {min.push(Integer.MAX_VALUE);}public void push(int val) {stack.push(val);min.push(Math.min(val, min.peek()));}public void pop() {if(stack.isEmpty()){return;}stack.pop();min.pop();}public int top() {return stack.peek();}public int getMin() {return min.peek();}}
}

这是求解这道题的第一种方法。


第二种方法:

其实和第一种方法思路差不多,我们可以把新添加元素和栈里面的最小元素一起加入栈中,这样我们可以少用一个栈的空间。如下图:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

要存储这样的数据我们可以使用一种特殊的数据类型, -->   record ,它是JDK16引用的新语法,

record 是一种新的关键字,用于创建不可变的(immutable)数据类,使用 record 关键字可以简化数据类的编写,并自动提供许多常见的方法,如 equals()hashCode()toString() 等。

record  Data(int  val,  int  min){

}

在上面的代码中,我们定义了一个名为 Data的记录类,它有两个字段 valmin。由于这是一个 record,Java 会自动为这个类生成 equals()hashCode()toString(), 和一个构造函数。并为两个字段生成对应的get、set方法。

代码实现:
static class MinStack2 {record Data(int val, int min){}private final LinkedList<Data> stack = new LinkedList<>();public void push(int val) {if(stack.isEmpty()){  //第一次添加,新元素就是栈的最小值stack.push(new Data(val, val));}else{stack.push(new Data(val, Math.min(val, stack.peek().min)));}}public void pop() {stack.pop();}public int top() {return stack.peek().val;}public int getMin() {return stack.peek().min;}}

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

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

相关文章

为什么做测试既要懂开发又要懂产品?这3点看完,你就懂了!

本篇讨论的是什么呢&#xff1f;何谓一个真正的测试&#xff1f; 纯粹是个人的理解&#xff0c;仅供参考。 ● 论一个真正的软件测试工程师 ● 自动化在项目中的应用 ● 性能专项在项目中的应用 半个产品、半个开发 有人觉得这个标题有点讽刺&#xff0c;真正的测试&…

Socket通信---Python发送数据给C++程序

0. Problems 很多时候实现某种功能&#xff0c;需要在不同进程间发送数据&#xff0c;目前有几种主流的方法&#xff0c;如 让python和C/C程序互相发送数据&#xff0c;其实有几种方法&#xff1a; 共享内存共享文件Socket通信 在这里只提供Socket通信的例程&#xff0c;共享…

【JavaScript】如何自定义事件并触发

前言 有些教程中说使用 Event.initEvent() 创建事件&#xff0c;但是此方法已弃用&#xff0c;所以下文使用new Event()。 mdn官方文档中&#xff0c;明确说明Event.initEvent()弃用。 建议使用Event()构造函数&#xff0c;这里以chrome为例&#xff0c;兼容请很强&#xff0c;…

[Git] 配置Access Token 解决Github 认证弹窗

[Git] 配置Access Token 解决Github 认证弹窗 1. 前言2. 解决2.1 申请Personal Access Token2.2. 配置Token2.3. 授权激活Token 博主热门文章推荐&#xff1a; 1. 前言 最近从bitbucket切换到了Github Enterprise, 刚使用几次发现 每次操作 都有弹窗认证&#xff0c; 虽然手动点…

六、回归与聚类算法 - 逻辑回归与二分类

线性回归欠拟合与过拟合线性回归的改进 - 岭回归分类算法&#xff1a;逻辑回归模型保存与加载无监督学习&#xff1a;K-means算法 1、应用场景 2、原理 2.1 输入 2.2 激活函数 3、损失以及优化 3.1 损失 3.2 优化 4、逻辑回归API 5、分类的评估方法 5.1 精确率和召回率 5.2…

Vivado 2015.4安装记录

一、资源 安装破解包&#xff1a;Vivado2015.4,提取码&#xff1a;4eaw 二、安装 2.0、解压缩 2.0.1、解压缩Xilinx_Vivado_SDK_Win_2015.4_1118_2.tar.gz 2.0.2、解压缩Xilinx_Vivado_SDK_Win_2015.4_1118_2.tar 2.1、安装 Vivado四个版本&#xff1a; Vivado HL WebPCK&a…

WordPres Bricks Builder 前台RCE漏洞复现(CVE-2024-25600)

0x01 产品简介 Bricks Builder是一款用于WordPress的开发主题,提供直观的拖放界面,用于设计和构建WordPress网站。它使用户能够轻松创建自定义的网页布局和设计,无需编写或了解复杂的代码。Bricks Builder具有用户友好的界面和强大的功能,使用户可以通过简单的拖放操作添加…

win32 汇编读文件

做了2个小程序&#xff0c;没有读成功&#xff1b;文件打开了&#xff1b; .386.model flat, stdcalloption casemap :noneinclude windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib include Comdlg32.inc includelib …

CPEOS:国家遥感数据与应用服务平台

文章目录 Main高分数据线上展厅遥感卫星技术成果支撑单位 Main 主页&#xff1a;https://www.cpeos.org.cn/home/ 高分数据 线上展厅 遥感卫星 技术成果 支撑单位

LeetCode刷题计划----day5

19 力扣链接&#xff1a;https://leetcode.cn/problems/squares-of-a-sorted-array/description/ 文章讲解链接&#xff1a;https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8…

【Docker实操】部署php项目

概述 最终达成的容器部署结构和原理如下图&#xff1a; 一、获取nginx、php官方镜像 docker pull nginx //拉取nginx官方镜像 docker pull php:7.4-fpm //拉取php官方镜像需要获取其他可用的php版本&#xff0c;可以上【docker hub】搜索【php】&#xff0c;所有的【xxx-fp…

day39打卡

day39打卡 62. 不同路径 状态表示 我们暂时设dp[i] [j]&#xff1a;以(i, j)为终点&#xff0c;所到达i使用的方法的数量 状态转移方程 从题目中可以看出&#xff0c;dp(i, j)的值取决于dp(i-1, j)和dp(i, j-1)的值&#xff0c;因为机器人只能向右或者向下走。 且我们猜测…