数据结构与算法之栈的最小值

扩展堆栈(stack) O(1) 时间访问栈中最小值(或最大值) <br />问题描述:扩展stack的实现,完成正常的push,pop操作,新增访问最小(或最大)元素的接口Min(),使得push,pop,Min的时间复杂度都是O(1)。<br />问题分析:拿到这道题,我们最先的思考往往是,设计一个算法从栈中拿到最小值,所以开始考虑任何可以用来实现该功能的排序和查找算法。假设栈中有n个元素,一切排序和查找都不可能实现O(1)的时间复杂度找到最小值。<br />再看题目,既然是扩展stack的实现,stack是一种数据结构,一种数据的组织方式,扩展它,也就允许我们对其数 阅读详情

题目:
实现一个特殊的栈,在实现栈功能基础上,并实现返回栈的最小值

要求:
pop,push,getMin方法的时间复杂度O(1)
设计的栈类型可以使用现成的栈结构

Java的Stack类

Java的Stack类:
1. boolean empty()——测试堆栈是否为空。
2. Object peek( )——查看堆栈顶部的对象,但不从堆栈中移除它。
3. Object pop( )——移除堆栈顶部的对象,并作为此函数的值返回该对象。
4. Object push(Object element)——把项压入堆栈顶部。
5. int search(Object element)——返回对象在堆栈中的位置,以 1 为基数。

代码
package cn.scnu.stack;

/**
 * 题目:实现一个特殊的栈,在实现栈功能基础上,并实现返回栈的最小值
 *
 * 要求:
 *      pop,push,getMin方法的时间复杂度O(1)
 *      设计的栈类型可以使用现成的栈结构
 */

import java.util.Stack;

/**
 * Java的Stack类
 * 1 boolean empty()——测试堆栈是否为空。
 * 2 Object peek( )——查看堆栈顶部的对象,但不从堆栈中移除它。
 * 3 Object pop( )——移除堆栈顶部的对象,并作为此函数的值返回该对象。
 * 4 Object push(Object element)——把项压入堆栈顶部。
 * 5 int search(Object element)——返回对象在堆栈中的位置,以 1 为基数。
 */
class MyStack{
    private Stack<Integer> stackData = new Stack<>();
    private Stack<Integer> stackMin = new Stack<>();

    public void push(Integer num){
        this.stackData.push(num);
        if(this.stackMin.empty()){
            this.stackMin.push(num);
        }else if (num<=this.getMin()){ //小于等于在于如果两个相等的值,都是最小值,就算弹出其中一个,另一个也是剩下的最小值
            this.stackMin.push(num);
        }

    }
    public Integer pop(){
        if (this.stackData.empty()) {
            throw  new RuntimeException("你的栈为空");
        }else {
            int value  = this.stackData.pop();
            if(value == this.getMin()){
                this.stackMin.pop();
            }
            return value;
        }

    }
    public Integer getMin(){
        if(this.stackMin.empty()){
            throw  new RuntimeException("你的栈为空!!");
        }else{
            return this.stackMin.peek();
        }
    }

}

public class Demo01 {
    public static void main(String[] args) {

        /*
            算法实现原理
         */
        MyStack myStack = new MyStack();  //初始化一个栈

        /*
            添加数据:
                    1. 将数据添加到栈
                    2. 判断当前最小值存在不存在
                        1) 如果不存在,将该数据保存到最小值
                        2) 如果存在,将该数据和最小值比较,如果该数据小,则替换。
         */
        myStack.push(12);

        /*
            获取最小值:
                即,如果最小值栈不为空,那么最小值就是最顶的值
         */
        int min = myStack.getMin();
        System.out.println(min);
                /*
            弹出数据:
                    1. 将数据弹出
                    2. 如果该数据和最小值相等,则将最小值的栈也弹出一个
                    3. 如果不想等,那么最小值的栈不变
         */
        int num = myStack.pop();
        System.out.println(num);

        /*
            测试
         */
        MyStack myStack1 = new MyStack();

        for (int i = 10; i >0 ; i--) {
            myStack1.push(i);
        }
        //获取栈的最小值
        System.out.println("最小值="+myStack1.getMin());
        //获取一个栈的数据
        System.out.println(myStack1.pop());
        System.out.println("最小值="+myStack1.getMin());


    }

}
方法2

class MyStack2{
    private Stack<Integer> stackData = new Stack<>();
    private Stack<Integer> stackMin = new Stack<>();

    public void push(Integer num){
        this.stackData.push(num);
        if(this.stackMin.empty()){
            this.stackMin.push(num);
        }else if (num<=this.getMin()){
            this.stackMin.push(num);
        }else{
            //当num>this.getMin,则将上一个最小值重复压入,这样在取出的时候就不需要进行判断了
            int newNum = stackMin.peek();
            this.stackMin.push(newNum);
        }

    }
    public Integer pop(){
        if (this.stackData.empty()) {
            throw  new RuntimeException("你的栈为空");
        }
        this.stackMin.pop();
        return this.stackData.pop();

    }
    public Integer getMin(){
        if(this.stackMin.empty()){
            throw  new RuntimeException("你的栈为空!!");
        }else{
            return this.stackMin.peek();
        }
    }

}
区别如下

这里写图片描述

常用数据结构2——栈,实现PUSH、POP和取最小值操作算法时间复杂度为o(1) 看到一道笔试题,要求设计一个“栈”数据结构,使得对该栈的PUSH(进栈)、POP(出栈)以及取最小值(MIN)操作的时间复杂度为o(1)。我在网上搜了下,大家貌似也是用双栈来实现的。之所以说是双栈,是因为还有个最小值栈,当push的值最小的时候同时在最小值栈push,当pop的值正好是最小值的时候,同时将最小值栈的数据弹出。      我自己写了个栈结构,最小栈没有显式的pop和push,栈都用 阅读详情

相关推荐

最小栈:不仅是栈,更是算法里的“侦探助手”

最小栈:不仅是栈,更是算法里的“侦探助手”

Echo_Wish 137

设计一个具有获取最小值(getMin)方法的栈

一、题目描述 实现一个特殊的栈结构,该栈在具有一般栈的结构的基础上还具有获取栈最小元素的功能。 二、题目要求 1.栈的pop、push、getMin操作的时间复杂度均为O(1); 2.设计特殊栈的时候可以使用现成的栈作为工具去完成。 三、题目解析 题目要求提醒我们可以使用现成的栈的数据结构,其实也就是告诉我们要使用其作为工具去构建我们的特殊的栈,因为其getMin操作是O(1),因此告诉我们其操作肯定不是在自己的栈里瞎折腾,因此我们需要两个栈,一个用来存储基本数据,另一个用来存储getMin操作

小猛同学的博客 1282

从零构建智能ai语音助手:ESP32s3+Python+大语言模型实战指南

本文详细介绍了基于ESP32S3硬件和Python后端的智能语音助手系统开发指南。系统采用ESP32S3采集语音,通过WebSocket实时传输到Python后端处理,利用大语言模型实现自然语言理解和意图识别,再通过TTS合成语音返回。文章从系统架构、工作流程、技术实现(包括OPUS编码、WebSocket通信、ESP32音频处理)等方面进行了详细讲解,并提供了分阶段学习路线和常见问题解决方案。该项目展示了物联网技术与AI技术的融合应用,相比传统语音系统具有更高的灵活性和智能性,为开发者提供了完整的实现方案

Despacito0o的博客 2629

7-1 栈的最小容量

设栈S和队列Q的初始状态为空,元素1~n 依次进入S,一个元素出栈后即进入Q,若规定了这n个元素的出队序列,请模拟输出 入栈 和 出栈 过程,并输出实现这个出队序列的栈S的最小容量。输入数据保证都是合法的,即所有的出队序列都是可以实现的。

2301_80386162的博客 759

手把手复现论文:SVPWM过调制I区与II区算法仿真(附MATLAB源码)

本文详细介绍了SVPWM过调制I区与II区算法的MATLAB仿真实现,从理论推导到Simulink建模逐步解析。通过源码示例展示幅值补偿和六边形跟踪等关键技术,帮助电力电子研究者掌握过调制算法的核心实现方法,适用于电机控制、变频器等工业应用场景。

weixin_28739079的博客 529

Windows下Colmap编译安装全攻略:从Boost到CUDA的避坑指南

本文详细介绍了在Windows系统下编译安装Colmap三维重建工具的完整流程与实战经验。针对Boost库版本兼容性、CUDA与Visual Studio的版本匹配等常见难题提供了具体的避坑指南和解决方案,帮助开发者高效完成从环境配置到最终部署的全过程。

weixin_28235513的博客 198

【006】LeetCode155 最小栈

题目155. 最小栈 6.1 官方解析 点击这里 方法一:辅助栈 思路 要做出这道题目,首先要理解栈结构先进后出的性质。 对于栈来说,如果一个元素 a 在入栈时,栈里有其它的元素 b, c, d,那么无论这个栈在之后经历了什么操作,只要 a 在栈中,b, c, d 就一定在栈中,因为在 a 被弹出之前,b, c, d 不会被弹出。 因此,在操作过程中的任意一个时刻,只要栈顶的元素是 a,那么我们就可以确定栈里面现在的元素一定是 a, b, c, d。 那么,我们可以在每个元素 a 入栈时把当前栈的最小值 m

ClimberCoding 541

LCD工程师必看:Pixelclock、Mipi Clk计算全解析(附实用公式)

本文为LCD工程师详细解析了像素时钟(Pixelclock)与MIPI时钟(Mipi Clk)的核心计算方法。文章从时序参数构成入手,通过实战公式推导,系统阐述了从屏幕分辨率、刷新率到最终MIPI速率的高效计算链路,并提供了实用的调试思路与排查清单,帮助工程师快速解决画面撕裂、闪烁等常见问题。

weixin_29266679的博客 388

MySQL开源工具推荐,有了它我卸了珍藏多年Nactive!

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)最近无意间发现了一款开源免费的 MySQL 客户端管理工具,磊哥试用了两天...

磊哥聊Java 981

Dify DSL文件分享 Dify讨论群 大模型token资源等(持续收集更新)

基于LLMOps平台-Dify的一站式学习平台。包含不限于:Dify案例、DSL文件分享、模型接入、Dify交流讨论等各类资源分享。

同名公众号:dify实验室 3714

泛微OA表单开发实战:如何用JavaScript动态控制明细表的必填与可编辑属性

本文详细介绍了如何在泛微OA系统中使用JavaScript动态控制明细表字段的必填与可编辑属性。通过主表字段变更事件监听和明细表字段属性批量修改,实现智能化的表单交互,提升用户体验和系统灵活性。文章深入解析了关键API的使用方法,并提供了实战代码示例和最佳实践。

weixin_30955617的博客 548

栈的艺术:从“堆盘子”到“最小值栈”的算法奇旅——揭秘数据结构设计的精妙哲学

栈是计算机世界的乐高积木,但现实问题从不满足于基础形态。当盘子堆叠成塔,我们如何优雅地拆解崩塌风险?当最小值藏身数据洪流,怎样在毫秒间将其捕获?今天,我们将用两个经典问题——和揭开算法设计中的与看工程师如何用数学思维驯服复杂世界的混沌!

司徒鸿的博客 1197

宇树G1二次开发资料汇总

宇树科技G1是一款29自由度的商业级人形机器人,配备NVIDIA Jetson Orin NX计算平台和完整SDK生态。本文系统介绍了G1的硬件架构、29个关节配置、传感器外设、双计算单元设计等关键信息,并详细解析了软件生态体系,包括C++/Python SDK、ROS2接口、仿真工具和AI框架。开发者可通过DDS通信实现高层运动控制或底层关节级精确控制,支持快速二次开发。文档提供了网络配置、接口调用示例等实用指南,帮助开发者高效利用该平台进行人形机器人应用开发。

m0_47999117的博客 1313

数据结构算法面试题:请实现一个栈,在栈中支持取出最小值的操作。

题目:请实现一个栈,在栈中支持取出最小值的操作。

jakelihua 187

【TCN回归预测】TCN时间卷积神经网络数据回归预测(多输入单输出)【含Matlab源码 2317期】

TCN时间卷积神经网络数据回归预测 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版)或下载付费资源,可赠送奶茶价版付费专栏指定代码1份; 822

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数据结构与算法(JAVA版)2_5:查询栈中每次push或pop之后,栈中的最小值

查询每次pop之后栈中的最小值,如对于栈3,1,2(栈顶),当pop=2时,min=1;当pop=1时,min=3;当pop=3时,min=null. package com.inspire.chapter2; import java.util.Stack; public class GetMinStack { // 查询每次pop之后栈中的最小值,如对于栈3,1,2(栈顶),当pop=2时,min=1;当pop=1时,min=3;当pop=3时,min=null; public static cl

weixin_42424330的博客 197

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

数据结构与算法(一)--- 栈

这里写自定义目录标题就业方向新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 就业方向 Web网站 移动App 小程序 游戏 桌面应用 服务端 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准

FAN的博客 594

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

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

栈表中获取最小值,时间复杂度为O(1)

近来复习数据结构,看到网上有一道数据结构的算法题,该题目为google的一道面试题,国内很多互联网公司也纷纷效仿该题。        题目内容为:对现在的stack(栈)数据结构进行改进,加一个min()功能,使之能在常数,即o(1),时间内给出栈中的最小值。可对push()和pop()函数进行修改,但要求其时间复杂度都只能是o(1)。         解题思路:1.由于题目要求的是一个栈,所

helinlin007的专栏 7722

python栈的最小值

class MinStack: def __init__(self): """ initialize your data structure here. """ self.min_stack=list() #辅助栈,用来存每一次进栈时的最小值,最小值就辅助栈,比辅助栈的值大是不需要进 self.stack=list() #栈 def push(self, x: int) -> None

weixin_50139649的博客 680

【面试现场】如何实现可以获取最小值的栈?

【面试现场】题目:我现在需要实现一个栈,这个栈除了可以进行普通的push、pop操作以外,还可以进行getMin的操作,getMin方法被调用后,会返回当前栈的最小值,你...

WantFlyDaCheng的博客 148

【前端算法入门】栈

做两道题来熟悉一下栈的使用

weixin_44045702的博客 292

【知识积累】返回栈中的最小值

package com.example.demo.algorithm.D002; import java.util.Stack; /** * @Description : * 返回栈中的最小值 * * @Author : Darren * @Date : 2021 年 02 月 18 日 20:41:07 * @since : 1.0 */ public class J005_GetStackMin { public static void main(String[] args.

Darren的博客 232

算法学习一----设计包含min函数的栈

这学期大三了,身边的同学都在准备找实习了,就业压力挺大的说,最近为了准备求职的笔试,很长时间都没有写博客了。最近都在学习C++和数据结构,现在接触算法,以前算法课堂没有好好上,只是把实验题做了就一了百了,没有大的提升,所以现在想在准备笔试的时候把算法好好的补一补,于是在这里记录自己的学习过程。 今天学习了一个挺有趣的算法,是微软面试100题中的题目。题目如下: 设计包含mi

yipiankongbai的专栏 989

求栈中数据的最小值

题目描述:  实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。  【要求】  1.pop、push、getMin操作的时间复杂度都是O(1)。  2.设计的栈类型可以使用现成的栈结构。 解题思路:   使用一个辅助栈,里面存的目前栈中的最小值 代码实现:      1 class GetMin 2 { 3 public: 4 vo...

weixin_33695450的博客 217

155.最小栈|辅助栈|辅助元组

栈中保存一对元组,以(当前值,当前栈中的最小值)的形式 class MinStack: def __init__(self): self.stack = [] def push(self, val: int) -> None: if len(self.stack) == 0:# 空栈 self.stack.append((val, val)) # 栈中最小值就是自身 else: s..

weixin_44019018的博客 257

【数据结构】Leetcode——栈与队列经典题

Contents1.用栈实现队列(232)2.用队列实现栈(225)3.最小值栈(155)4.用栈实现括号匹配(20)5. 单调栈 / Next Greater Element(739) / 循环数组5.1 数组中元素与下一个比它大的元素之间的距离(739)5.2 循环数组中比当前元素大的下一个元素(503)6 返回数组中滑动窗口的最大值 / 单调队列 / 双端队列(239) 开始之前学两个单词热热身: naive [naɪˈiːv]      adj. 缺乏经验的; 幼稚的; 无知的; 轻信的; 天真的

Bryce-HJ 618
上一篇: 机器学习之算法篇
下一篇: Ubuntu修改swappiness
江城子_Lay
博客等级 码龄9年 19粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值