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

【中等】力扣算法题解析LeetCode155:最小栈 本文介绍了一种实现最小栈的高效方法,通过双栈结构在常数时间内完成所有操作。主栈存储所有元素,辅助栈(最小栈)存储非严格递减的最小值序列。关键操作包括:push时同步更新最小栈,pop时检查是否需要弹出最小栈栈顶。该方法保证了push、pop、top和getMin均为O(1)时间复杂度,且空间优化显著。附Java代码实现及示例说明,适合面试高频题快速掌握。 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/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.min
            cur = 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);//头插法,当前值和最小值相同,所以他俩的差值为0
            return;
        }
        // 栈不为空时,每次压入计算与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+peek
        return (int)(min+peek);
    }
    
    public int getMin() {
        return (int)min;
    }
}
ArcGIS Pro2.5深度学习使用注意事项 ArcGIS Pro2.5深度学习使用中的注意事项1、ArcGIS Pro2.5深度学习使用中的注意事项1.1、Label深度学习样本工具参数介绍1.2、准备数据参数介绍1.3、训练模型介绍1.4、ArcGIS Pro2.5深度学习推理工具和模型对应关系介绍1.4.1、Classify Objects Using Deep Learning1.4.2、Classify Pixels Using D... 阅读详情

相关推荐

从解压到编译:手把手带你用TeXstudio搞定第一篇ACM LaTeX论文

本文详细指导如何使用TeXstudio从解压ACM LaTeX模板到成功编译第一篇学术论文的全过程。涵盖环境准备、模板配置、TeXstudio设置及常见问题排查,特别针对ACM会议论文格式要求,帮助学术新人快速掌握LaTeX写作技巧。

weixin_30655569的博客 255

【算法】LeetCode 155—最小栈 - 详解与实现

本文介绍了如何实现一个在常数时间内检索最小元素的栈(MinStack)。通过使用双栈设计(普通栈+辅助最小栈),详细解析了push、pop、top和getMin操作的实现原理,并提供了完整的C++代码实现。文章强调当新元素≤当前最小值时同步压入最小栈,出栈时若栈顶等于最小值则同步弹出最小栈的优化策略,确保所有操作时间复杂度均为O(1)。该解法是栈结构经典的应用场景,适用于算法基础学习和面试准备。

qq_2778465975的博客 2041

用面包板实测MOSFET:手把手教你测量跨导和开关时间

本文详细介绍了如何使用面包板、Arduino和示波器搭建测试平台,实测MOSFET的跨导和开关时间。通过分步测量流程和示波器技巧,帮助电子设计初学者深入理解MOSFET的动态特性,包括跨导计算、开关时间参数解析以及米勒平台现象分析。

beer8的博客 224

LeetCode刷题汇总

剑指offer 剑指 Offer 03 数组中重复的数字 剑指 Offer 04 二维数组中的查找 剑指 Offer 05 替换空格 剑指 Offer 06 从尾到头打印链表 剑指 Offer 07 重建二叉树 剑指 Offer 09 用两个栈实现队列 剑指 Offer 10- I 斐波那契数列 剑指 Offer 10- II 青蛙跳台阶问题 剑指 Offer 11 旋转数组的最小数字 剑指 Offer 12 矩阵中的路径 剑指 Offer 13 机器人的运动范围 剑指 Offer 14- I 剪绳子 剑指

weixin_44171872的博客 2万+

Ubuntu20.04下运行VINS系列:VINS-Mono、VINS-Fusion和GVINS

安装好了VINS-Mono所需的ROS noetic、Eigen3.4.0、Ceres2.10和OpenCV4.2.0等。VINS-Mono是在ROS melodic以及Ceres1的环境下开发的,因此需要适配高版本的环境。

zardforever123的博客 2万+

从东南大学906被刷到调剂过程(内含个人感想)

介绍了自己在看到初试成绩,到后期复习以及调剂的全过程,当中也包含了自己的复试中的感想,希望大家理性看待。

Philo的博客 2858

力扣最热一百题——最小栈

力扣最热一百题!两种解法两种写法,超详细解释新手也能学会!!!

WenJGo的博客 1435

RoCEv2 (RDMA over Converged Ethernet) 技术详细介绍

本文深入解析RDMA over Converged Ethernet (RoCEv2)技术,该技术是AI时代算力网络的核心。文章从四个维度展开:首先阐述RDMA如何通过零拷贝和内核旁路解决传统网络的数据搬运瓶颈;接着拆解RoCEv2协议栈,对比其与InfiniBand和iWARP的特性差异;然后分析其在分布式AI训练、高性能存储等场景的关键价值;最后提供实战指南,强调无损网络配置、流量隔离和精细监控的重要性。RoCEv2虽能带来微秒级延迟和极低CPU开销,但需精心设计网络环境才能发挥最大效能。

技术引领业务创新 1393

力扣刷题路线

结合高频题、经典题和算法思想学习建议,分阶段从基础到进阶编排,覆盖所有核心标签,并标注题号与学习方法。:画图模拟快慢指针移动,如移动零时快指针探路、慢指针标记非零位置。:括号生成时,左括号数不能超过n,右括号数不能超过左括号数。:LCA问题中,若左右子树均含目标节点,则当前节点为祖先。:终止条件、递归调用、返回值,如二叉树深度递归返回。:掌握虚拟头节点、递归反转、环形检测。:掌握索引操作、快慢指针、滑动窗口。:熟悉括号匹配、单调栈、层序遍历。:熟悉反转、哈希统计、回文处理。

FAQEW的博客 1819

【docker】--- 详解 WSL2 中的 Ubuntu 和 Docker Desktop 的区别和关系!

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。

秋知叶i 1314

使用Simulink进行四足机器人的非线性动力学建模与仿真

四足机器人的运动包含多个自由度(DOF),包括腿部的摆动和支撑阶段的动力学特性。由于存在接触力、摩擦以及不同地形的影响,四足机器人的动力学行为呈现出高度的非线性特征。因此,构建准确的非线性动力学模型对于研究机器人的运动学和动力学特性至关重要。定义代表机器人状态的变量,如位置、速度、角度和角速度。matlab深色版本通过本指南,我们介绍了如何基于Simulink搭建一个四足机器人的非线性动力学模型,并进行了详细分析。

xiaoheshang_123的博客 311

【LeetCode 热题 100】155. 最小栈

Problem:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。实现 MinStack 类:MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int getMin() 获取堆栈中的最小元素。

最短的捷径就是绕远路,绕远路才是我的最短捷径。 2036

倍福CX9020(WINCE 7)控制器使用方法和操作

CX9020系列是倍福控制器中较为经济的,操作系统为Windows Embedded Compact 7(简称WINCE7或WINEC7),相对高端控制器(WINES7以上系统),操作系统古老而简洁,上位机软件的编写困难很多,本文是笔者在使用过程中摸索的流程,旨在为CX9020系列的新用户提供参考,也可供其他CE系统的控制器参考。本文中大部分截图采用倍福中国的培训文档,这是由于笔者是在流程走通后再写这篇文章,不想再恢复出厂设置走一遍截图。因笔者在写这篇文章时使用倍福控制器经验并不丰富,难免有纰漏,请读者批评

weixin_41883890的博客 4287

LeetCode刷题笔记-数据结构-day14

学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)

2401_83916283的博客 747

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

LeetCode题练习与总结:最小栈--155

本文详细介绍了如何设计一个能在常数时间内检索到最小元素的栈。通过使用一个辅助栈来存储每次 push 操作时的最小值,我们可以在 O(1) 时间内完成所有操作。这个问题的解决方案涵盖了 Java 编程语言的基础语法、面向对象编程的概念、数据结构的运用以及算法设计技巧。

一直学习永不止步 1630

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

LeetCode第155题—最小栈

LeetCode、java、数据结构

Green_756的博客 1612

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LeetCode155:最小栈,最简单的中等难度题,时间击败100%,内存也低于官方

官方代码是直接使用JDK的Deque对象,这样的代码能学到什么?熟练操作API吗?还是自己实现一个最小栈吧,用时击败100%,内存击败78%

程序员欣宸的博客 1092

【JAVA刷题初阶】刷爆力扣第四弹——栈

括号匹配 && 最小栈 && 下一个最大的数I

爱打酱油的新一的博客 916

LeetCode 刷题【155. 最小栈】

两种实现最小栈的解法。第一种使用栈+链表结构,通过链表维护有序节点来获取最小值,但操作较复杂。第二种是官方题解方案,采用双栈结构,主栈存储数据,辅助栈同步存储当前最小值

gzkhxohc的博客 509

【LeetCode】第155题——最小栈(难度:简单)

【LeetCode】第155题——最小栈(难度:简单)题目描述解题思路代码详解注意点 题目描述 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) —— 将元素 x 推入栈中。 pop() —— 删除栈顶的元素。 top() —— 获取栈顶元素。 getMin() —— 检索栈中的最小元素。 示例: 输入: [“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”] [[],[-2],

Se7en_Dayz的博客 260

Java版LeetCode热题100之最小栈:深入解析与实战应用

最小栈问题是栈的经典变种,考察对数据结构特性的理解;辅助栈法是最优解:思路清晰、代码简洁、效率高;关键在于利用栈的状态确定性,为每个状态预存最小值;时间 O(1),空间 O(n),符合题目所有要求。

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 1107

LeetCode刷题155-简单-最小栈

算法作为极其重要的一点,是大学生毕业找工作的核心竞争力,所以为了不落后与人,开始刷力扣算法题!

布小禅的博客 497

LeetCode 155:最小栈

LeetCode 155:最小栈题目描述解题思路代码实现总结 题目描述 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) – 将元素 x 推入栈中。 pop() – 删除栈顶的元素。 top() – 获取栈顶元素。 getMin() – 检索栈中的最小元素。 示例: MinStack minStack = new MinStack(); minSt...

香农三定律的博客 314

LeetCode 155. 最小栈 - 辅助栈与编码常数空间详解

题目描述:设计一个栈,支持 push、pop、top、getMin 四个操作,并保证每个操作时间复杂度为 O(1)。其中 getMin 返回当前栈中的最小元素。原题链接:https://leetcode.cn/problems/min-stack/难度等级:Medium相关标签:栈、数据结构、设计、辅助栈、编码技巧| 解法 | 时间复杂度 | 空间复杂度 | 优点 | 缺点 | 适用场景 |

m0_52114506的博客 890

LeetCode155. 最小栈(java)

题目: 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) – 将元素 x 推入栈中。 pop() – 删除栈顶的元素。 top() – 获取栈顶元素。 getMin() – 检索栈中的最小元素。 示例: 代码: 解法一 class MinStack { private Stack<Integer> stackData; ...

inferno_devil的博客 524

leetcode刷题记录(八十三)——155. 最小栈

155. 最小栈 - 力扣(LeetCode)155. 最小栈 - 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。实现 MinStack 类: * MinStack() 初始化堆栈对象。* void push(int val) 将元素val推入堆栈。* void pop() 删除堆栈顶部的元素。* int top() 获取堆栈顶部的元素。* int getMin() 获取堆栈中的最小元素。

weixin_45994787的博客 687
上一篇: java数据结构与算法刷题-----LeetCode347. 前 K 个高频元素
下一篇: java数据结构与算法刷题-----LeetCode739. 每日温度
ydenergy_殷志鹏
博客等级 码龄7年 5887粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值