LeetCode算法题-Min Stack(Java实现)

电源完整性仿真流程梳理 可根据仿真流程导图,一步一步的去设置完成仿真。仿真的关键,在于对电路回路的理解以及所放置的电压源与电流的合理性,对于去耦电容的选择,则需要根据谐振频率计算,从而选取有效滤波的容值。 阅读详情

这是悦乐书的第177次更新,第179篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第36题(顺位题号是155)。设计一个支持push,pop,top和在恒定时间内检索最小元素的堆栈。

push(x) - 将元素x推入堆栈。

pop() - 删除堆栈顶部的元素。

top() - 获取顶部元素。

getMin() - 检索堆栈中的最小元素。

例如:

MinStack minStack = new MinStack();

minStack.push(-2);

minStack.push(0);

minStack.push(-3);

minStack.getMin(); - >返回-3。

minStack.pop();

minStack.top(); - >返回0。

minStack.getMin(); - >返回-2。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

利用整型数组和ArrayList作为栈。

入栈的时候,创建一个容量为2的数组,数组第一个元素是要入栈的元素,第二个元素是最小值,将数组添加到list中。

出栈的时候,获取list的最后一个元素,并将其移除,此时的最小值是list最后一位元素(数组)的第二个值。

获取栈顶,即是list中最后一位元素(数组)的第一个值。

最小值直接返回最小值即可。

class MinStack {

    private List<int[]> stack ;
    private int min ;

    public MinStack() {
        stack = new ArrayList<int[]>();
    }

    public void push(int x) {
        int[] arr = new int[2];
        arr[0] = x;
        arr[1] = stack.isEmpty() ? x : Math.min(x, min);
        min = arr[1];
        stack.add(arr);
    }

    public void pop() {
        if (!stack.isEmpty()) {
            stack.remove(stack.size()-1);
            min = stack.isEmpty() ? 0 : stack.get(stack.size()-1)[1];
        }
    }

    public int top() {
        return stack.get(stack.size()-1)[0];
    }

    public int getMin() {
        return min;
    }
}

03 第二种解法

此解法使用了栈本身和优先队列两种结构,优先队列是为了解决最小值的问题。

入栈、出栈、栈顶这些操作都可以用栈本身的方法,而最小值则是优先队列的头部元素,因为优先队列自带排序算法,在初始化时如果不指定排序方式,则默认以自然方式排序。所以在入栈时,一并也将元素放入优先队列中,而最小值就是队列的头部元素,而其他元素的顺序是不是按升序依次排列的,这个还真不一定,但是如果你通过实现Comparable接口,重写其compareTo方法,可以按照自己定义的方式来排序。

class MinStack2 {
    PriorityQueue<Integer> pQueue = new PriorityQueue<Integer>(); 
    Stack<Integer> stack = new Stack<Integer>();                    

    public MinStack2() {}

    public void push(int x) {
        pQueue.add(x);
        stack.push(x);
    }

    public void pop() {
        int trmp = stack.pop();
        pQueue.remove(trmp);
    }

    public int top() {
        return stack.peek();
    }

    public int getMin() {
        return pQueue.peek();
    }
}

04 第三种解法

使用两个栈,一个作为正常的栈进行入栈、出栈、获取栈顶操作,另外一个栈则存储最小值,每次在第一个栈进行入栈和出栈操作时,都要进行判断,对第二个栈中的最小值进行相应的操作。

class MinStack3 {
    private Stack<Integer> s1 = new Stack<>();
    private Stack<Integer> s2 = new Stack<>();

    public MinStack3() {}

    public void push(int x) {
        s1.push(x);
        if (s2.isEmpty() || s2.peek() >= x) {
            s2.push(x);
        }
    }

    public void pop() {
        int x = s1.pop();
        if (s2.peek() == x) s2.pop();
    }

    public int top() {
        return s1.peek();
    }

    public int getMin() {
        return s2.peek();
    }
}

05 第四种解法

较之第三种解法,此解法只使用了一个栈来完成入栈、出栈、获取栈顶和最小值的全部操作。

入栈时,如果新入栈的元素比最小值小,那么要将旧的最小值入栈,并且新的最小值是此时新入栈的元素,最后再将新元素入栈。

出栈时,如果要移除的元素正好是当前最小值,那么就需要再出栈一次,并且最小值等于第二次出栈要移除的值,因为入栈时是会将旧的最小值添加进去的,所以出栈时要做此判断。

class MinStack4 {
    int min = Integer.MAX_VALUE;
    Stack<Integer> stack = new Stack<Integer>();

    public void push(int x) {
        if(x <= min){          
            stack.push(min);
            min = x;
        }
        stack.push(x);
    }

    public void pop() {
        if(stack.pop() == min) {
            min=stack.pop();
        }
    }

    public int top() {
        return stack.peek();
    }

    public int getMin() {
        return min;
    }
}

06 小结

算法专题目前已连续日更超过一个月,算法题文章35+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

【CANoe示例分析】SOMEIPWithvCDL_16 本示例来源于官方提供的示例工程:0004_基于vCDL实现SOMEIP通信_Demo\0004_基于vCDL实现SOMEIP通信_Demo\SOMEIPWithvCDL。 阅读详情

相关推荐

解决 PyInstaller 与 `pathlib` 包不兼容的问题

为了避免 PyInstaller 和pathlib包的兼容性问题,最简单的解决办法就是卸载不必要的pathlib包。只需在命令行中运行卸载命令,然后重新打包即可。

Winfredzhang的博客 3227

leetcode Min Stack题解

题目描述: Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack. pop() -- Removes the element on top of the stack. top(...

leo_weile的博客 203

玩转肺癌目标检测数据集Lung-PET-CT-Dx ——①从TCIA获取影像数据集

该目标检测公共数据集源自 The Cancer Imaging Archive(TCIA),是肿瘤研究方面的著名的医学影像公开数据库。 数据以 DICOM 格式存储,由肺癌受试者的 CT 和 PET-CT DICOM 图像组成。

takedachia的博客 1万+

【LeetCode】Min Stack(最小栈)

这道题是LeetCode里的第155道题。 题目描述: 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x)-- 将元素 x 推入栈中。 pop()-- 删除栈顶的元素。 top()-- 获取栈顶元素。 getMin() -- 检索栈中的最小元素。 示例: MinStack minStack = new MinStack(); ...

『诞生之时已至,以此修正万象』 446

从零到一:STM32CubeMX虚拟串口开发中的常见陷阱与优化策略

本文深入探讨了STM32CubeMX在USB虚拟串口开发中的常见问题与优化策略,涵盖数据流吞吐量瓶颈、实时性约束等核心挑战。通过实战案例和代码示例,详细解析了波特率同步异常、数据丢失等问题的解决方案,并提供了DMA配置和中断优先级调优的高级技巧,帮助开发者提升STM32虚拟串口的性能和可靠性。

weixin_29164185的博客 370

智能车竞赛卡丁快跑组:自动驾驶与人车交互技术实战解析

本文深入解析了智能车竞赛卡丁快跑组的技术核心,重点探讨了自动驾驶与人车交互两大模块的实战方案。文章详细拆解了从环境感知、路径规划到语音识别、命令执行的完整流程,并分享了基于单片机平台的调试心法与赛场经验,为参赛者提供了一套从零开始、分步攻坚的系统性备赛指南。

f0g1h2的博客 1179

设计一个具有getMin()功能的栈

设计一个具有getMin()功能的栈: 1.push、pop、getMin()时间复杂度为O(1) 2.设计栈时可以使用现有的栈结构/** * 设计一个具有getMin()功能的栈: * 1.pop,push,getMin()时间复杂度为O(1) * 2.设计的栈可以使用现有的栈结构 * @author Nemo * */ public class StackDemo { pr

qq_33387902的博客 435

Frida三层次钩子快速逆向VMP+OLLVM加固APK

VMP(虚拟机保护)和OLLVM(控制流平坦化)是Android应用常见的双重混淆技术,其核心原理是将Java逻辑虚拟化、Native代码控制流打散,从而阻断传统静态分析与简单Hook。但任何混淆都必须在CPU上执行,因此必然暴露JNI注册行为、ABI参数传递规律及系统调用痕迹。基于此,Frida可通过跨层联动——从JNI_OnLoad捕获Native库加载、在VMP解释器入口截获字节码上下文、于关键系统调用(如read/gettimeofday)反向追踪数据流——构建可观测、可复现的动态分析链。该方法无需

weixin_30888413的博客 1003

【LeetCode】Min Stack(最小栈)

【LeetCode】Min Stack(最小栈)题目链接:https://leetcode.com/problems/min-stack/description/难度:Easy题目描述:Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.push(x) --...

Mr.王同学 3395

Unity卡牌游戏UI框架:数据驱动与模块化设计实践

在Unity游戏开发中,UI系统是连接玩家与游戏逻辑的关键桥梁,其核心在于实现数据与表现的高效同步。数据驱动设计通过分离数据模型、逻辑状态与视图表现,利用观察者模式自动响应状态变化,确保了代码的清晰与可维护性。这种架构显著提升了开发效率,尤其在需要复杂状态管理和实时反馈的交互场景中,如卡牌游戏的拖拽、布局与动画系统。基于模块化思想,开发者可以将卡牌视图、布局管理、区域控制等组件像积木一样组合,快速构建出动态的手牌弧形布局、战场区域管理等特色功能。通过集成对象池、图集优化等性能方案,还能有效管理绘制调用与网格

weixin_34262482的博客 453

图形推理2-四大类六提示

图形推理笔记2

小y的学习笔记 6750

java数据结构与算法之栈(Stack)设计与实现

【版权申明】转载请注明出处(请尊重原创,博主保留追究权!) http://blog.youkuaiyun.com/javazejian/article/details/53362993 出自【zejian的博客】 关联文章:java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayLi...

zejian的博客 5854

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

min java_LeetCode算法题-Min Stack(Java实现)

这是悦乐书的第177次更新,第179篇原创01 看题和准备今天介绍的是LeetCode算法题中Easy级别的第36题(顺位题号是155)。设计一个支持push,pop,top和在恒定时间内检索最小元素的堆栈。push(x) - 将元素x推入堆栈。pop() - 删除堆栈顶部的元素。top() - 获取顶部元素。getMin() - 检索堆栈中的最小元素。例如:MinStack minStack =...

weixin_42300162的博客 378

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

LeetCode-155. Min Stack [C++][Java]

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

贫道绝缘子的博客 318

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【LeetCode】Min Stack 解题报告

【题目】 Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack.pop() -- Removes the element on top of the stack.top

跳出温水的青蛙 1万+

【LeetCode】155. Min Stack 最小栈(Easy)(JAVA)

【LeetCode】155. Min Stack 最小栈(Easy)(JAVA) 题目地址: https://leetcode.com/problems/min-stack/ 题目描述: Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) – Push element x onto stack. pop() – Removes the elemen

qq_16927853的博客 228

Leetcode [Min Stack] java

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack.pop() -- Removes the element on top of the stack.top() -- Get

crystal_tyan 549

Leetcode155. Min Stack

设计一个栈,除了栈特有的功能,入栈、出栈、查看栈顶元素,还需要增加一个功能,得到当前栈里边最小的元素。

magic_jiayu的博客 323

【Leetcode】Min Stack

题目链接:https://leetcode.com/problems/min-stack/ 题目: Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack.pop() --

业精于勤,荒于嬉 2331

(Java)leetcode-155 Min Stack

题目 【设计最小栈】 Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) – Push element x onto stack. pop() – Removes the element on top of the stack. top()...

不思量 224

LeetCode 155: Min Stack

题目描述 思路 利用Stack,push的时候看是否造成最小值变化,如果最小值发生变化,push上一个最小值,改变最小值,不管是否改变最小值都push现在的值。pop的时候看是否造成最小值变化,(如果弹出的值是当前最小值说明最小值发生变化 ,进行判断的时候 弹出一次),再弹出一次更改min为前一个最小值,因为push的时候push了前一个最小值和现在的最小值。 java实现 class Min...

zero 164

【Leetcode 题解】Min Stack

一、原题: Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack.pop() -- Removes the element on top of the stack.to

DR_TITI的专栏 770

LeetCode 155 : Min Stack (Java)

解题思路:用java写的话有个需要注意的地方就是由于Stack中的元素用了泛型,而泛型不支持基本类型,所以需要基本类型的包装类。而包装类不同于基本类型的是包装类是引用,要比较相等不能简单使用==,要使用equals方法。 LeetCode官网unlock的提示: Hints:Consider space-time tradeoff. How would you keep track of th

changetocs的博客 2818

LeetCode 155.Min Stack【Java】

LeetCode155.最小栈 #####【题目描述】https://leetcode-cn.com/problems/min-stack/ #####【解题思路】 ​ 在书上看到两种解题思路,第一种是在压入的时候省空间弹出的时候费时间,第二种是压入费空间弹出省时间。时间复杂度和空间复杂度分别为O(1)和O(n)。我觉得第一种比较好理解而且在LeetCode上运行的效率也比较高,所以在...

NayelyA的博客 238
上一篇: LeetCode算法题-Linked List Cycle(Java实现)
下一篇: LeetCode算法题-Intersection of Two Linked Lists(Java实现)
程序员小川
博客等级 码龄10年 47粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值