在 O(1) 时间复杂度获取栈中最大值和最小值

【数据结构】实现栈-输出最大值,最小值,时间复杂度O(1) @TOC 问题 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的getMin和最大元素的getMax函数。在该栈中,调用getMin、getMax、push及pop的时间复杂度都是O(1).。 解题思路 用辅助栈记住每次入栈的当前最小值/最大值:在入栈时,往辅助栈中加入当前最小值/最大值;出栈时,辅组栈也出栈一个元素。最小值/最大值从辅助栈中获取栈顶元素。 基础代码实现 import java.util.ArrayList; import java.util.EmptyStackExceptio 阅读详情

问题描述

  如何在O(1)时间复杂度获取栈中的最大值和最小值?

问题分析

  普通栈规定的push(入栈)、pop(出栈)、peek(查看栈顶)等操作都只能在栈顶上操作,如果栈中元素是有序的,那么我们就可以记录栈顶和栈底元素完成问题要求,但这是不可能的。普通栈不能解决问题,显然我们需要重新定义一种新的栈结构。能否在栈中定义两个变量min和max记录最小值和最大值呢,答案是否定的,因为并不是只有进栈操作,经过一系列出栈操作后,有可能最开始的最大值和最小值已经出栈。为了解决这个问题,我们就需要两个辅助栈记录栈的每个状态下的最大值和最小值。

算法描述

  定义一个minStack栈和一个maxStack栈,分别在栈顶保存当前栈内最小值和最大值,以minStack为例,每次有元素入栈,就与minStack的栈顶元素比较,若小于栈顶元素,则入栈成为新的栈顶元素,若大于栈顶元素,则入栈原先的栈顶元素,maxStack栈与上述思路相同。出栈时,三个栈都需要出栈。定义getMin与getMax函数分别返回minStack和maxStack栈顶元素,实现在O(1)时间复杂度获取栈中的最小值和最大值。

性能分析

  时间复杂度:O(1)

  空间复杂度:O(N)

  加入两个辅助栈实现O(1)时间复杂度获取栈中的最大值和最小值,典型的以空间换取时间。

代码实现

// Java
class MyStack {
    public void push(int e) {// 新建MyStack数据结构的push函数
        stack.push(e);// 元素入栈
        // 判断是否需要更新minStack栈顶元素
        if (minStack.isEmpty() || e < minStack.peek()) {
            minStack.push(e);// 入栈元素更小,更换栈顶元素
        } else if (e >= minStack.peek()) {
            minStack.push(minStack.peek());// 不用更换栈顶元素
        }

        // 判断是否需要更新maxStack栈顶元素
        if (maxStack.isEmpty() || e > maxStack.peek()) {
            maxStack.push(e);// 入栈元素更大,更换栈顶元素
        } else if (e <= maxStack.peek()) {
            maxStack.push(maxStack.peek());// 不用更换栈顶元素
        }
    }
    public int pop() {// 新建MyStack数据结构的pop函数
        // 三栈全部出栈
        int ret = stack.pop();
        minStack.pop();
        maxStack.pop();
        return ret;
    }
    public int getMin() {// O(1)时间返回最小值
        return minStack.peek();
    }
    public int getMax() {// O(1)时间返回最大值
        return maxStack.peek();
    }
    
    private Stack<Integer> stack = new Stack<>();// 存储栈
    private Stack<Integer> minStack = new Stack<>();// 最小值辅助栈
    private Stack<Integer> maxStack = new Stack<>();// 最大值辅助栈
}
// C++
class MyStack {
public:
    void push(int e) {// 新建MyStack数据结构的push函数
        stacks.push(e);// 元素入栈
        // 判断是否需要更新minStack栈顶元素
        if (minStack.empty() || e < minStack.top()) {
            minStack.push(e);// 入栈元素更小,更换栈顶元素
        } else if (e >= minStack.top()) {
            minStack.push(minStack.top());// 不用更换栈顶元素
        }

        // 判断是否需要更新maxStack栈顶元素
        if (maxStack.empty() || e > maxStack.top()) {
            maxStack.push(e);// 入栈元素更大,更换栈顶元素
        } else if (e <= maxStack.top()) {
            maxStack.push(maxStack.top());// 不用更换栈顶元素
        }
    }
    void pop() {// 新建MyStack数据结构的pop函数
        // 三栈全部出栈
        stacks.pop();
        minStack.pop();
        maxStack.pop();
    }
    int top() {
        return stacks.top();
    } 
    int getMin() {// O(1)时间返回最小值
        return minStack.top();
    }
    int getMax() {// O(1)时间返回最大值
        return maxStack.top();
    }
    
private:
    stack<int> stacks;// 存储栈
    stack<int> minStack;// 最小值辅助栈
    stack<int> maxStack;// 最大值辅助栈
};
java设计一个栈,实现O(1)获取max,min (ACM模式) //设计一个栈,实现O(1)获取最大最小值的栈,pop、push、getMin、getMax 操作的时间复杂度都是O(1) //解题思路:可以使用两个栈,第一个栈stack用于存放压入的数据, // 第二个栈min用于存放当前入栈数据中的最小数,与栈顶元素比较大小,若小于栈顶元素,则入栈成为新的栈顶元素, // 若大于栈顶元素,则入栈原先的栈顶元素。max同理 // 当stack pop元素时,min也跟着pop元素。 import java.util.Scanner; import java.util.S 阅读详情

相关推荐

工厂自动化布线实战:从功率计算到线槽布局的完整避坑指南

本文详细介绍了工厂自动化布线的实战经验,从功率计算到线槽布局的完整避坑指南。通过三步计算法确定线径需求,强调电压降控制的重要性,并分享线槽布局的50%法则和强弱电分离技巧。特别针对移动设备和多芯信号线提供专业解决方案,帮助工程师避免常见错误,提升布线效率和质量。

weixin_29266007的博客 351

使用栈在O(1)的时间复杂度求最大值

一般求最大值都需要浏览栈中的所有值

Holmes_Conan的专栏 1774

GD32F4系列替换STM32F4,HAL库CAN初始化卡死?一个Sleep模式的坑与填坑实录

本文详细解析了GD32F4系列替换STM32F4时,HAL库CAN初始化卡死的问题根源——Sleep模式差异。通过对比两款芯片CAN控制器的默认状态,提出了不修改HAL库源码的解决方案,即在HAL_CAN_MspInit()中清除SLEEP位,并分析了该方法的优势。文章还提供了国产MCU替换的通用建议和调试技巧,帮助开发者高效解决问题。

weixin_29174013的博客 216

找堆栈中最小元素 时间复杂度O(1)

题目:O(1)找堆栈中最小元素 思路:(基本思路:空间换时间) 1.首先先初始化两个堆栈s1,s2 (s1用于正常的堆栈存取,s2用于存放堆栈的最小数据 。 2. 新建函数spush,(如果堆栈s2为空先入栈),如果新入s1的数据要比已存在s2栈顶的 数据要小,则再存入s2。 3.当退出数据时,如果数据和s2栈顶的元素相同,则s2栈顶元素一并弹出...

weixin_42978870的博客 1132

高级数据结构之R树(R-tree)

R树(R-tree)是一种将B树扩展到多维情况下得到的数据结构,它最初由Antonin Guttman于1984年提出。B树的结点中会存储一个键的集合,这些键把线分成片段,沿着那条线的点仅属于一个片段。因此,B树使得我们可以很容易地找到点。如果把沿线各处的点表示成B树结点,我们就能够确定点所属唯一子结点,在那里可以找到该点。 Antonin Guttman在他提出R树的经典论文中给出的R树例子...

白马负金羁 1万+

Python图像处理之光斑分析

光斑是工程中经常出现的图像数据,其特点是目标明确,分布清晰。对光斑图像的分析,主要包括质心定位、目标截取以及半径拟合等。

微小冷的学习笔记 2857

java实现栈-输出最大值,最小值,时间复杂度O(1)

问题:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的getMin函数。在该栈中,调用getMin、push及pop的时间复杂度都是O(1). 最小值思路:用一个辅助栈stack2记住每次入栈stack1的当前最小值:在stack1入栈时,往stack2中加入当前最小值;stack1元素出栈时,stack2也出栈一个元素。最小值从stack2中获取及栈顶元素。O(1) 最大值思路:...

在黑暗中寻找光明 2774

基于LED可见光通信的物联网系统设计_344

随着物联网技术的不断发展,传统无线通信在工业环境中面临电磁干扰强、通信质量不稳定等问题。为此,本文设计了一种基于LED可见光通信的物联网系统,实现工厂车间内设备状态的稳定、高效、低干扰数据传输。系统主要由设备节点、设备主机、华为云物联网服务器以及可视化上位机构成。 设备节点采集机器的出货量、运行状态、机身温度等关键信息,通过调制后的LED可见光信号发送至设备主机。主机利用红外接收器接收光信号后进行解调处理,并通过WIFI模块将数据上传至华为云IOT服务器。

344

算法题:O(1)时间复杂度实现获取栈的最大值、最小值

问题描述 实现O(1)获取最大最小值的栈 问题:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的getMin函数,getMax函数。在该栈中,调用getMin、getMax、push及pop的时间复杂度都是O(1). 思路 定义一个minStack辅助栈每次记住入栈stack的最小值,即:将数据分别入栈stack和minStack,当入栈minStack的时候,与栈顶元素比较大小,若小于栈顶元素,则入栈成为新的栈顶元素,若大于栈顶元素,则入栈原先的栈顶元素。 getMax的思路同上。 代码 im

FiveStarsGeneral的博客 2834

基于滤波反投影的图像重建算法matlab仿真

基于滤波反投影的图像重建算法是一种用于医学影像重建的计算机辅助技术。该算法可以从投影数据中重建出高质量的三维图像,被广泛应用于医学影像学、CT、PET等领域。本文将详细介绍基于滤波反投影的图像重建算法的原理、步骤和应用。一、原理介绍基于滤波反投影的图像重建算法基于X射线CT成像原理,它的主要思想是通过对投影数据进行处理,反推出被成像物体的三维形状。其核心原理是投影数据与目标物体之间的线性关系,即通过估计目标物体的吸收率来计算投影数据的变化,从而反推出目标物体的三维形状。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 385

LPDDR5 学习笔记05:WCK操作详解

LPDDR5 SDRAM采用双时钟设计,写时钟(WCK)频率为命令时钟(CK)的2倍或4倍,需要通过WCK2CK同步机制解决时钟域对齐问题。该同步操作由带特殊标志位的CAS命令触发,控制器需提供半频WCK脉冲进行状态校准。同步完成后才能执行读写操作,且支持多存储体组同步和WCK常开模式以优化性能。掉电后必须重新执行同步流程,确保时钟域正确对齐。该机制有效解决了高速内存接口的时序挑战,为LPDDR5性能提升提供关键技术支撑。

一只豌豆象的博客 2004

如何在O(1)时间复杂度获取栈中最大值和最小值

问题描述:   如何在O(1)时间复杂度获取栈中的最大值和最小值? 问题分析:   普通栈规定的push(入栈)、pop(出栈)、peek(查看栈顶)等操作都只能在栈顶上操作,如果栈中元素是有序的,那么我们就可以记录栈顶和栈底元素完成问题要求,但这是不可能的。普通栈不能解决问题,显然我们需要重新定义一种新的栈结构。能否在栈中定义两个变量min和max记录最小值和最大值呢,答案是否定的,因为并不是...

Acx7的博客 148

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

实现O(1)获取最大最小值的栈----java

实现O(1)获取最大最小值的栈和队列----java 一.如何实现包含获取最小值函数的栈 问题:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的getMin函数。在该栈中,调用getMin、push及pop的时间复杂度都是O(1). 最小值思路:用一个辅助栈stack2记住每次入栈stack1的当前最小值:在stack1入栈时,往stack2中加入当前最小值;st

毛毛虫的小哈 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

构造一个栈,pop(),push(),min(),max()复杂度都是o(1)的Java实现

思路: 1、利用额外空间处理 2、push时,把最小元素压入栈中,再有新元素进入等于当前最小元素则重复压入,保证压入重复元素是无误 3、poll时,弹出元素,与当前最小值一致则弹出。 代码如下: package com.my.test.datastructure.stack; import java.util.Stack; /* * 实现一个栈 获取最大、最小值、pop()、pu...

聚沙成塔 1935

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

O(1)时间复杂度来获得队列或栈的最大值或者最小值

  该类题型通常是让自己设计并封装应用程序接口(Application Programming Interface, API),即一些预先定义的函数,或指软件系统不同组成部分衔接的约定。   通常是使用常用的数据结构组合或是作为辅助空间来实现这些接口。具体选用何种数据结构来实现,一是依照题目中对时间或空间复杂度的要求,二是在平常的练习当中多加总结。   以下列出相关题目,题目中对时间复杂度的要求均为O(1)O(1)O(1),所以很容易想到用空间换取时间的思路。 (一) 剑指 Offer 30. 包含min函

To the beyond and infinity! 3728

时间复杂度为O(1),求栈最大最小值和pop,push操作

时间复杂度为O(1),求栈最大最小值和pop,push操作#ifndef _MSTACK#define _MSTACK#include templatestruct MStack{  MStack* prev;  T Data;};templateclass CMStack{public:  CMStack(){  top =NULL; 

JoeHan的专栏 2972

栈的实现

【题目】:实现一个栈,在实现基础功能的基础上提供获取最大最小值的功能【要求】:pop、push 、getmin、getmax操作时间复杂度均为o(1)【分析】:栈的基本功能是先进后出,本题对时间要求高对空间没有,所以这类题目一般是以空间换时间,空间和时间一般都是相互对立的。# -*- coding: utf-8 -*- """ 基于列表实现栈 实现 pop push getmin getmax o...

CBoy的专栏 316

最小栈与最大队列

剑指 Offer 30. 包含min函数的栈 题意:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。 要求:得到最小值元素的min时间复杂度要求为O(1) 思想:利用额外的栈来记录当前的最小值,如果当前push的元素比当前helper栈中的元素小或等于将其push到helper栈中(注意对于等于的处理,因为要在出栈的时候做出栈使用) 实现: class MinStack { private:

qq_25065595的博客 367

offer30 offer59_II 栈和队列的最小最大值(线性复杂度)(简单)

offer_30 包含min函数的栈 Offer 59 - II. 队列的最大值 本文对上述两个题目做适当延申,如何模拟求队列和栈的最小值和最大值。 重点:要实现min/max的时间复杂度为O(1) 故增加一个辅助列表 两个任务各个函数复杂度: 时间复杂度:O(1) 空间复杂度:O(n) 分析举例:(延申的代码没实现 各实现了一个) # 求队列最大值的话 则 q1 = [-2 0 -3] q2 = [-2 0] ...

棉花糖的博客 137

实现一堆栈,要求三个操作,Pop,Push,GetMaxValue,时间均为O(1)

问题描述 扩展stack的实现,完成正常的push,pop操作,新增访问最小(或最大)元素的接口Min(),使得push,pop,Min的时间复杂度都是O(1)。 问题分析 拿到这道题,我们最先的思考往往是,设计一个算法从栈中拿到最小值,所以开始考虑任何可以用来实现该功能的排序和查找算法。假设栈中有n个元素,一切排序和查找都不可能实现O(1)的时间复杂度找到最小值。再看题目,既然是扩展stack的实

sipherhern的博客 4104

leetcode打卡

最小栈,队列的最大值 这两题有点类似,都是要实现O(1)的时间取出最小值或最大值,用空间换时间 155.最小栈 新建一个辅助栈(因为栈先进后出,所以辅助的性质要与原来的一样),由于要取的是最小值,所以只在新加进来的元素比原来元素小时压入辅助栈。弹出的时候只在弹到最小值的时候把辅助栈的值弹出去。(这里要注意,考虑到最小值的相等问题,所以等于最小值的元素也要加入辅助栈) 面试题59 - II.队列的最...

weixin_43838915的博客 229

动态数据中求最大值或最小值

1、包含min函数的栈 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 思路 用一个栈st1装载数据,利用一个辅助栈st2记录此时st1栈中的最小数据,每次元素入栈st1,和此时st2中的栈顶元素比较,若入栈元素比st2栈顶元素小或等于栈顶元素,则入栈st1同时入栈st2,;否则只入栈st1。st1出栈时,也同st2栈顶元素比较,若...

ysl_ysl123的博客 1875

java 要求用时空复杂度O(1)求出栈(结构自定)中的最大最小值

package com.zhangheng; import java.util.Stack; /** * 栈的使用 高效求栈中的最大最小值 时空复杂度均是O(1) * @date 2018-10-26 * @author hengzhang2@iflytek.com * * @param &lt;E&gt; */ public class SpecialStack&lt;E e...

forever_insist的博客 310
上一篇: 这就是一致性哈希算法?
下一篇: 小艾和她女朋友(俄罗斯农民乘法)
ali48
博客等级 码龄6年 31粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值