java数据结构与算法刷题-----LeetCode155. 最小栈

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

在这里插入图片描述

1. 法一:使用辅助最小栈

解题思路:时间复杂度O(1),空间复杂度O(n)
  1. 我们出栈和入栈时,要同步维护一个最小值栈
  2. 最小值栈主要保存当前最小值
  3. 这样,我们就可以实时获取当前栈中最小值
  4. 图解如下:
  1. 入栈-2,则栈顶元素为-2,当前最小值也是-2
    在这里插入图片描述
  2. 入栈0,此时栈顶为0,但是最小值还是-2,所以最小栈依然入栈-2
    在这里插入图片描述
  3. 入栈-3,当前最小值为-2,但是-3比-2小,所以最小栈入栈-3
    在这里插入图片描述
  4. 此时执行getMin()操作获取当前最小值,那么直接获取最小栈的栈顶-3.
  5. 此时执行出栈操作,那么栈顶元素为-3. 同样的,最小栈也需要出栈
    在这里插入图片描述
  6. 此时执行top操作,也就是获取栈顶元素,那么直接获取栈顶的0即可
  7. 再次执行getMin()获取最小值,那么直接获取最小栈的栈顶-2即可。
代码

在这里插入图片描述

class MinStack {//用链表模拟栈,作为栈存储的容器class ListNode {int val;//当前结点的值int min;//当前最小值。用一个变量模拟最小值栈ListNode next;//下一个结点public ListNode() {}public ListNode(int val, int min, ListNode next) {this.val = val;this.min = min;//min就是最小值栈this.next = next;}}ListNode head;//头结点public MinStack() {head = new ListNode();//头结点初始化}//入栈操作public void push(int val) {ListNode next = head.next, cur;//获取栈顶元素next,cur是当前要插入结点if (next != null && next.min < val) {//如果栈不为空//但是当前栈中最小值,比val更小,那么将当前结点入栈,但是最小值依然保存next.mincur = new ListNode(val, next.min, next);}else {//如果栈为空,直接入栈当前结点//或者栈不为空,但是当前结点的值更小的话,那么新的最小值为当前的val值cur = new ListNode(val, val, next);}head.next = cur;//头插法,实现先入后出}//出栈public void pop() {ListNode del = head.next;//取出栈顶元素head.next = del.next;//头结点指向新的栈顶元素}//获取栈顶元素的值public int top() {return head.next.val;}//获取最小值,就在栈顶元素的min变量中保存public int getMin() {return head.next.min;}
}/*** Your MinStack object will be instantiated and called as such:* MinStack obj = new MinStack();* obj.push(val);* obj.pop();* int param_3 = obj.top();* int param_4 = obj.getMin();*//*** Your MinStack object will be instantiated and called as such:* MinStack obj = new MinStack();* obj.push(val);* obj.pop();* int param_3 = obj.top();* int param_4 = obj.getMin();*/

1. 法二:使用差值

解题思路:时间复杂度O(1), 空间复杂度O(1)
  1. 用变量min保存当前栈中最小值,而入栈时,保存当前值与最小值的差值
  1. 初次入栈,最小值和入栈值相同,所以差值为0
    在这里插入图片描述
  2. 第二次入栈时,入栈0,与-2差值为0 - ( -2 ) = 2
    在这里插入图片描述
  3. 第3次入栈时,入-3,与-2的差值为 ( -3 ) - ( -2 ) = -1. 最小值更新为-3.我们发现如果遇到更小值,那么差值为负数,并且更新了最小值
    在这里插入图片描述
  4. 此时执行getMin()获取最小值,直接返回Min变量保存的-3即可
  5. 此时执行出栈操作,我们发现,栈顶元素为负数,说明他就是当前最小值,那么需要执行逆运算获取接下来的最小值。
  1. 获取时的式子是:当前值 - 最小值 = 入栈值,(-3) - (-2) = 1并令当前值-3成为新的最小值
  2. 则当前 , 需要出栈的元素值,就是当前最小值-3
  3. 而新的最小值需要逆运算得出,最小值 = 当前值(就是当前最小值-3) - 入栈值 = (-3) - (-1) = -2. 故,出栈后,新的最小值为-2
    在这里插入图片描述
  1. 此时执行top操作获取栈顶元素,也需要逆操作。
  1. 如果栈顶元素<=0说明,当前最小值就是栈顶元素
  2. 如果不是,那就是通过式子:入栈值 = 原来的值 - 最小值得到的
  3. 还原则需要:原来的值 = 入栈值+最小值 = 2 + (-2) = 0. 故当前栈顶元素为0.
  1. 此时执行getMin()操作,获取最小值,依然获取MIn保存的值-2即可。
代码

在这里插入图片描述

class MinStack {// 记录每个元素与【未压入】该元素时栈中最小元素的差值LinkedList<Long> stack;// 当前【已压入】栈中元素的最小值private long min;public MinStack() {stack = new LinkedList();//初始化栈}public void push(int val) {// 压入第一个元素if(stack.isEmpty()){//栈为空时min = val;//最小值就是当前值stack.addFirst(0L);//头插法,当前值和最小值相同,所以他俩的差值为0return;}// 栈不为空时,每次压入计算与min的差值后压入结果stack.push((long)val-min);// 更新min,保存更小的min = Math.min((long)val,min);// 上面两个语句是不能颠倒的!一定是先压入,在更新,因为min一定是当前栈中的最小值}public void pop() {long pop = stack.removeFirst();// 当弹出元素小于0时,说明弹出元素是当前栈中的最小值,要更新最小值if(pop<0){// 因为对于当前弹出的元素而言,计算压入栈中的值时,计算的是该元素与【未压入】该元素时// 栈中元素的最小值的差值,故弹出该元素后栈中的最小值就是未压入该元素时的最小值// 即当前元素的值(min)减去两者的差值long lastMin = min;min = lastMin - pop;}// 若大于等于0,不会对min有影响}public int top() {long peek = stack.peek();// 若当前栈顶小于等于0,说明最小值就是栈顶元素if(peek<=0) return (int)min;// 否则就是min+peekreturn (int)(min+peek);}public int getMin() {return (int)min;}
}

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

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

相关文章

自己怎么做小程序?如何通过小程序赚钱?如何确保产品有竞争力?

引言 随着科技的迅速发展&#xff0c;小程序已经成为创业者们进军电商领域的一种重要途径。在这个数字时代&#xff0c;通过小程序卖东西已经成为一种便捷而高效的商业模式。本文将为您解析自己如何通过小程序销售商品&#xff0c;并实现盈利的关键步骤。无论您是初入创业圈的…

ClickHouse 基础(一)

官网 以毫秒为单位查询数十亿行 ClickHouse是用于实时应用和分析的最快、资源效率最高的开源数据库。 安装ClickHouse 使用ClickHouse&#xff0c;你有三个选择: ClickHouse云:官方ClickHouse作为一项服务&#xff0c;-由ClickHouse的创建者构建&#xff0c;维护和支持快速安…

【软件设计模式之适配器模式】

文章目录 前言一、适配器模式概述1.定义与目的2.使用场景系统升级与集成接口不一致问题的解决兼容旧版本API多种数据源处理 二、适配器模式的结构1.主要组件适配器&#xff08;Adapter&#xff09;目标接口&#xff08;Target Interface&#xff09;被适配者&#xff08;Adapte…

亚马逊广告:掌握基础知识以提升销量

如果你是一名卖家&#xff0c;希望通过亚马逊这个强大的电商平台扩大你的业务&#xff0c;那么了解亚马逊的广告系统就显得至关重要。有效地利用亚马逊广告服务不仅可以提高你的产品可见性&#xff0c;还可以增加销量&#xff0c;从而提升你的整体业绩。在本篇文章中&#xff0…

人机协同中的态势感知纠错

态势感知纠错在人机协同中是一种重要的技术手段&#xff0c;旨在提高机器感知和理解现实世界的能力&#xff0c;从而更好地支持人类的决策与行动。具体来说&#xff0c;态势感知纠错技术可以通过以下方式实现&#xff1a; 1、感知和理解 机器可以感知和理解环境中的各种信息&am…

Hadoop-Yarn-调度器总结

一、Yarn有哪些调度器 在cdh中Yarn组件中查看配置如下&#xff1a; 可以看到Yarn有三种调度器&#xff0c;分别是FairScheduler、FifoScheduler、CapacityScheduler&#xff0c;它们都是Hadoop的一个可插入调度器。 cdh默认的调度器是FairScheduler&#xff0c;hadoop默认的调…

神经网络权重初始化

诸神缄默不语-个人CSDN博文目录 &#xff08;如果只想看代码&#xff0c;请直接跳到“方法”一节&#xff0c;开头我介绍我的常用方法&#xff0c;后面介绍具体的各种方案&#xff09; 神经网络通过多层神经元相互连接构成&#xff0c;而这些连接的强度就是通过权重&#xff…

Linux-目录I/O-004

学习重点&#xff1a; 1.目录I/O的函数接口 2.目录的遍历&#xff0c;目录的递归遍历 1.【mkdir】 1.1函数原型 【int mkdir(const char *pathname, mode_t mode);】1.2函数功能 创建目录文件1.3函数参数 1.3.1【pathname】 文件路径1.3.2【mode】 文件的权限1.4返回值 …

【Java EE初阶二十】关于http(一)

1. 初识http HTTP 最新的版本应该是 HTTP/3.0&#xff0c;目前大规模使用的版本 HTTP/1.1&#xff1b; 下面来简单说明一下使用 HTTP 协议的场景: 1、浏览器打开网站 (基本上) 2、手机 APP 访问对应的服务器 (大概率) 前面的 TCP与UDP 和http不同&#xff0c;HTTP 的报文格式&a…

【conda环境 安装 tensorflow2.2】 解决方案

1.检查anaconda安装&#xff1a;在cmd输入 conda --version 2.检测已经安装的环境&#xff1a;conda info --envs 3.新建一个python3.5的环境&#xff0c;tensorflow&#xff1a; ###conda create -n xxx python3.5 xxx为虚拟环境名 ###conda create -n xxx python3.6 xxx为虚拟…

中科星图——影像卷积核函数Kernel之gaussian高斯核函数核算子、Laplacian4核算子和square核算子等的分析

简介 高斯核函数是图像处理中常用的一种卷积核函数。它是一种线性滤波器,可以实现图像的平滑处理。在图像处理中,高斯核函数的卷积操作可以用于去噪、平滑和模糊等任务。 高斯核函数的定义可以表示为一个二维高斯分布函数,表达式如下: G(x, y) = (1 / (2 * pi * sigma^2…

openGauss 5.0.0全密态数据库应用小试

前言 openGauss HCIA教材中&#xff0c;安全是一个重要的章节&#xff0c;在实际项目中&#xff0c;随着网络安全和信息安全形势的变化&#xff0c;企业也越来越重视数据库安全。去年在HALP内部进行openGauss培训时&#xff0c;安全特性就被学员们提出来要重点讲解&#xff0c…

【DC-DC】世微 AP2813 平均电流型双路降压恒流驱动器

产品描述 AP2813 是一款双路降压恒流驱动器,高效率、外 围简单、内置功率管&#xff0c;适用于 5-80V 输入的高精度降 压 LED 恒流驱动芯片。内置功率管输出最大功率可达 12W&#xff0c;最大电流 1.2A。 AP2813 一路直亮&#xff0c;另外一路通过 MODE1 切换 全亮&#…

使用C++调用浏览器、邮箱等

ShellExecute的功能是运行一个外部程式&#xff08;或者是开启一个已注册的文件、开启一个目录、列印一个文件等等&#xff09;&#xff0c;并对外部程式有一定的控制。 函数原型&#xff1a; HINSTANCE ShellExecute( HWND hwnd,LPCTSTR lpOperation,LPCTSTR lpFile,LPCTSTR …

SICTF Round#3 Web方向 题解WP

100&#xff05;_upload 题目描述&#xff1a;小茂夫说&#xff1a;一直上传恶意文件尊嘟要生气了&#xff0c;世事莫固守&#xff0c;转变思路求突破 开题&#xff0c;注意有个文件包含 题目把后缀过滤死了&#xff0c;无法上传php后缀文件。文件内容些许过滤&#xff0c;短…

算法-贪心算法

题目&#xff1a;给定一个字符串str&#xff0c;只由‘X’和‘.’两种字符构成。‘X’表示墙&#xff0c;不能放灯&#xff0c;也不需要点亮‘.’表示居民点&#xff0c;可以放灯&#xff0c;需要点亮如果灯放在i位置&#xff0c;可以让i-1&#xff0c;i和i1三个位置被点亮返回…

在ubuntu20.04 上配置 qemu/kvm linux kernel调试环境

一&#xff1a;安装qemu/kvm 和 virsh qemu/kvm 是虚拟机软件&#xff0c;virsh是管理虚拟机的命令行工具&#xff0c;可以使用virsh创建&#xff0c;编辑&#xff0c;启动&#xff0c;停止&#xff0c;删除虚拟机。 &#xff08;1&#xff09;&#xff1a;安装之前&#xff0c…

LLM应用开发与落地:chroma的近似搜索问题

背景 最近开始测试一个游戏客户的RAG模块&#xff0c;发现一个向量数据库中大家容易忽略的一个点&#xff1a;近邻搜索算法。一开始我们选择的是chroma作为向量数据库&#xff0c;因为chroma的用户接口和设计非常简单&#xff0c;而我偏向于简单。创建collection时设置的距离计…

2024牛客寒假算法基础集训营4

文章目录 A-柠檬可乐B-左右互博C-冬眠D-守恒E-漂亮数组G-数三角形&#xff08;easy&#xff09; A-柠檬可乐 #include<bits/stdc.h> #define endl \n #define int long long using namespace std; int a,b,k; void solve() {cin>>a>>b>>k;if(a>k*b…

EasySass: could not generate CSS file. See Output panel for details.微信小程序报错及解决

解决微信小程序导入vscode的easysass包报错 问题发现问题来源和解决制作不易&#xff0c;感谢三联&#xff0c;谢谢大家啦 问题发现 当我喜滋滋的在vscode中导入easysass包之后&#xff0c;又在微信小程序中添加vscode扩展&#xff0c;又去文件中改好了配置文件后却直接弹出了…