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.mzph.cn/news/696023.shtml

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

相关文章

【webpack】基础介绍

当我们深入分析Webpack时&#xff0c;可以更加详细地了解它的工作原理、构建流程、常用配置和插件。 工作原理&#xff1a; 解析模块&#xff1a; Webpack从入口文件开始&#xff0c;递归地解析模块之间的依赖关系&#xff0c;构建一个依赖图。解析过程中&#xff0c;Webpack会…

windows 10 和 11 的3个杀招软件

大家喜欢的3个windows 小工具 千万别开着杀毒软件解压 建议关闭后解压 小弟弟保证不是病毒 下载地址 : https://download.csdn.net/download/nn_84/88865566

ES6 面试题

1. const、let 和 var 的区别是什么&#xff1f; 答案&#xff1a; var 声明的变量是函数作用域或全局作用域&#xff0c;而 const 和 let 声明的变量是块级作用域。使用 var 声明的变量可以被重复声明&#xff0c;而 const 和 let 不允许重复声明同一变量。const 声明的变量…

Spring 类型转换、数值绑定与验证(一)— DataBinder

DataBinder 是Spring用于数据绑定、类型转换及验证的类。使用场景有&#xff1a;1&#xff09;xml配置文件定义bean,Spring 内部使用DataBinder 来完成属性的绑定&#xff1b;2&#xff09;Web请求参数绑定&#xff0c;在Spring MVC 中&#xff0c;Controller的方法参数通常会自…

Sora - 探索AI视频模型的无限可能

随着人工智能技术的飞速发展&#xff0c;AI视频模型已成为科技领域的新热点。而在这个浪潮中&#xff0c;OpenAI推出的首个AI视频模型Sora&#xff0c;以其卓越的性能和前瞻性的技术&#xff0c;引领着AI视频领域的创新发展。让我们将一起探讨Sora的技术特点、应用场景以及对未…

【Linux】Linux应用程序中需要忽略的信号:SIGPIPE、SIGHUP、SIGINT;以及信号详解

1、常用信号 1.1 SIGPIPE 当服务器关闭一个连接后,若客户端继续发送数据,系统会发送要给SIGPIPE信号给客户端所在的进程,该信号的默认处理是终止进程; 反过来,客户端断开socket连接, 服务端向一个失效的socket发送数据,也将导致服务的进程退出。 如果不想退出,需要忽…

Stable Diffusion 模型分享:Indigo Furry mix(人类与野兽的混合)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

内核栈是什么

内核栈&#xff08;Kernel Stack&#xff09;是操作系统内核为每个运行中的进程或线程分配的一块内存区域&#xff0c;用于保存内核级别的函数调用过程中的局部变量、参数以及返回地址等信息。每个进程或线程都有自己独立的内核栈。 内核栈与用户栈&#xff08;用户空间栈&…

开启智能互动新纪元——ChatGPT提示词工程的引领力

目录 提示词工程的引领力 高效利用ChatGPT提示词方法 提示词工程的引领力 近年来&#xff0c;随着人工智能技术的迅猛发展&#xff0c;ChatGPT提示词工程正逐渐崭露头角&#xff0c;为智能互动注入了新的活力。这一技术的引入&#xff0c;使得人机交流更加流畅、贴近用户需求&…

离职时好聚好散有多重要(11)

点击查看=》《web前端回忆录》 我跟我之前公司的ui设计老大聊着我在现在这家公司的处境,我说:"我想去厦门,不然在这家公司我看不到未来的路要怎么继续走下去,上升通道可能已经被锁死,再留下来对于我来说没有意义。" "这么巧,其实我今天已经办完离职手续了…

2024前端面试准备之TypeScript篇(一)

全文链接 1. 什么是TypeScript TypeScript是一种开源的编程语言,是JavaScript的一个超集。它添加了静态类型、类、接口和模块等特性,使得开发者能够更好地组织和维护大型应用程序。TypeScript代码可以被编译成JavaScript,从而可以在任何支持JavaScript的环境中运行。 2. …

2.22作业

test.c #include "test.h" seq_p creat_list(){seq_p L(seq_p)malloc(sizeof(seq_list));if(LNULL){printf("申请空间失败\n");return 0;}L->len0;return L; } int seq_p_empt(seq_p L){if(LNULL){return -12;}return L->len0?1:0; } int seq_p_fu…

华为OD机试真题-寻找最富裕的小家庭-2023年OD统一考试(C卷) --Python--开源

题目&#xff1a; 考察内容&#xff1a; dict–update—for sum max 代码&#xff1a; """ 题目分析&#xff1a;输入&#xff1a; N int 1,1000 成员总数 list len(list)N int 1, 1000000 财富值 N-1行&#xff0c; N1 N2, N1是N2的父节点 输出&#xff…

Flink 侧输出流(SideOutput)

&#x1f338;在平时大部分的 DataStream API 的算子的输出是单一输出&#xff0c;也就是某一种或者说某一类数据流&#xff0c;流向相同的地方。 &#x1f338;在处理不同的流中&#xff0c;除了 split 算子&#xff0c;可以将一条流分成多条流&#xff0c;这些流的数据类型也…

操作系统导论-课后作业-ch19

1. 本书在第6章中有过介绍&#xff0c;gettimeofday函数最多精确到us&#xff0c;并且大致精确&#xff08;并不完全精确&#xff09;&#xff0c;需要多迭代几次减少误差&#xff0c;循环次数太多也会导致结束时间小于开始时间&#xff08;即回滚&#xff09;的现象&#xff…

两数相加

2. 两数相加 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个…

C语言—指针(1)

碎碎念:做指针题的时候我仿佛回到了原点&#xff0c;总觉得目的是为了把框架搭建起来&#xff0c;我胡说的哈31 1.利用指针变量将一个数组中的数据反向输出。 /*1.利用指针变量将一个数组中的数据反向输出。*/#include <stdio.h> #include <time.h> #include <…

一文读懂:AWS 网络对等互连(VPC peering)实用操作指南

VPC peering connection-网络对等互连在您的 Atlas VPC 和云提供商的 VPC 之间建立私有连接。该连接将流量与公共网络隔离以提高安全性。本篇文章有VPC peering的操作指南以及价格等信息。如还有疑问请联系我们MongoDB的销售&#xff0c;客户成功经理或解决方案架构师。 1 使用…

2000-2022年各省环境规制数据(原始数据+计算过程+计算结果)

2000-2022年各省环境规制数据&#xff08;原始数据计算过程计算结果&#xff09; 1、时间&#xff1a;2000-2022年 2、范围&#xff1a;30省 3、来源&#xff1a;各省年鉴、国家统计局、统计年鉴 4、指标&#xff1a;年份、省份、工业污染源治理投资完成实际额、工业增加值…

gitlab,从A仓库迁移某个工程到B仓库,保留提交记录

从A仓库&#xff0c;拷贝 git clone --bare ssh://git192.168.30.88:22/framework/platform.git 在B仓库新建工程&#xff0c;注意&#xff1a;一定要去掉默认的生成README文件进入platform.git 文件夹下&#xff0c;推送到B仓库 git push --mirror ssh://git192.168.30.100…