随笔:设计一个栈结构,使得取出栈中最大值时间复杂度为O(1)

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

题意:设计一个数据结构,符合栈的特点,即“后进先出”,且加多一个要求,使得取出该栈所有元素最大值的时间复杂度可以控制为O(1)。


说个很明显的错误,使用一个辅助变量,保存当前最大值,每次入栈的值都与该最大值比较,大则替换为最大值。

这样取出最大值则返回该辅助变量,很显然这个只能实现一次正确返回。


总体实现很简单,就是开辟多一个存储最大值索引的栈,该栈和存储数据的栈保持同步,即栈顶指针同时作用这两个栈。

代码也很简单,所以就不解释。

java代码如下:


public class MaxNumFromStack {
	public static void main(String[] args) {
		MyStack stack=new MyStack();
		stack.push(2);
		stack.push(3);
		stack.push(4);
		stack.push(5);
		stack.push(1);
		stack.push(10);
		stack.push(8);
		for(int i=0;i<6;i++){
			System.out.println("TheNum:"+stack.pop());
			System.out.println("MaxNum:"+stack.getMax());
			System.out.println("=========================");
		}
	}
}
class MyStack{
	private int top;
	private int maxIndex;
	private int MAX;
	private int[] data;
	private int[] maxStackIndex;
	public MyStack(){
		MAX=10;
		top=-1;
		maxIndex=-1;
		data=new int[MAX];
		maxStackIndex=new int[MAX];
	}
	//入栈
	public void push(int num){
		top++;
		if(top>=MAX){
			System.out.println("栈已满,不能入栈");
			return;
		}
		data[top]=num;//先添加到栈中
		if(num>getMax()){//大于当前最大值
			maxStackIndex[top]=top;//当前是最大值
			maxIndex=top; 
		}else{
			//保留最大的值
			maxStackIndex[top]=maxIndex;
		}
	}
	//出栈
	public int pop(){
		if(top<0){
			System.out.println("栈为空,不能出栈");
			return Integer.MIN_VALUE;
		}
		int num=data[top];
		if(top==0){
			maxIndex=-1;
		}else if(top==maxIndex){//当前栈顶是最大值,调整最大值
			maxIndex=maxStackIndex[top-1];
		}
		top--;
		return num;
	}
	public int getMax(){
		if(maxIndex>=0){
			return data[maxIndex];
		}else{
			//返回最小值
			return Integer.MIN_VALUE;
		}
	}
}

输出:

TheNum:8
MaxNum:10
=========================
TheNum:10
MaxNum:5
=========================
TheNum:1
MaxNum:5
=========================
TheNum:5
MaxNum:4
=========================
TheNum:4
MaxNum:3
=========================
TheNum:3
MaxNum:2
=========================
实现一个栈,获取其中最大元素,获取时间复杂度为O(1) /**  * 实现一个栈,获取其中最大元素,获取时间复杂度为O(1)  * @MWD  * Date:2013-9-4  *  * Reference: http://www.cnblogs.com/pangxiaodong/archive/2011/08/12/2136260.html  */ package test; import java.util.*; p 阅读详情

相关推荐

扩展堆栈(stack) O(1) 时间访问栈中最小值(或最大值)

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

jim_wei的专栏 6565

[Daily]设计一个获取最小值时间复杂度为O(1)的栈

【题目】 实现一个栈,在实现栈的基本功能的前提下,再实现返回最小元素的操作。 【要求】 pop、push、getMin操作的时间复杂度都是O(1) 设计的类可以使用现成的栈结构。 【分析】 想要使得获取最小值的时间复杂度为O(1),最简单的方法就是提前将最小值记录下来,当我们需要获取时便可直接获取 栈的特点就是先进后出。它的操作具有一定规律,这使得我们可以很好的记录最小值。 很容易就能够...

ZhuSenlin的博客。 654

Opencv计算相机响应函数(Camera Response Function)与Radiance

本文主要用于记录自己在学习CRF过程中遇到的一些问题。 CRF模型 I=f(V(t⋅L))I=f(V( t\cdot L))I=f(V(t⋅L)) 其中III为相机灰度值Intensity,LLL为环境中irradiance,ttt为曝光时间,VVV为相机镜头参数,fff为相机响应函数CRF。 有些论文中认为相机镜头参数是线性的不考虑,但有些考虑了衰减即靠近图像边缘亮度会暗一些,但没有看到二者同时计算的,如果同时计算两个非线性的函数,我觉得可能会有不确定性,在这里还请教一下了解的朋友。 控制

larrydong的博客 6000

栈和队列:实现一个栈,O(1)时间复杂度获取栈内最大元素

实现一个栈,获取栈内最大元素 题目:实现一个栈,使栈的Push、Pop Top和Max的时间复杂度为O(1),Max()将返回栈内最大的元素。 思路:用两个栈,第一个是常规栈,第二个只存储到来的元素中比栈顶大的元素。 复杂度分析:时间复杂度符合题目要求O(1)。空间复杂度最坏情况附加的stack中需要储存每个元素,故额外使用O(n) 空间。 class stackWithMax{ private: stack<int> valueStack;

sessos的博客 1620

风控IV、AUC、KS python计算代码

df_temp:数据集,Y:是否逾期标签,feas_list:需要计算IV的 变量。2、 按月和不同Y 下的 IV计算。

暮雨听轩的专栏 1618

实战STM32G0驱动DRV8870/AT8870:PWM+DMA精准调速与H桥衰减模式详解

本文详细介绍了如何使用STM32G0单片机结合DRV8870/AT8870电机驱动芯片实现直流有刷电机的精准控制。重点讲解了PWM与DMA结合实现高效调速的硬件配置与软件驱动方法,并深入剖析了H桥快衰减与慢衰减模式的工作原理及应用场景,为嵌入式电机控制项目提供了完整的实战解决方案。

c7d8e9的博客 595

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

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

FiveStarsGeneral的博客 2834

STM32 FMC驱动AD7606实战:从硬件连接到时序调试全流程解析

本文详细解析了STM32 FMC驱动AD7606的全流程,包括硬件连接、FMC接口配置、驱动程序设计和时序调试。通过实战案例,展示了如何利用STM32的FMC总线实现与AD7606的高效数据传输,特别强调了电源设计、信号连接和PCB布局等关键要点,为嵌入式数据采集系统开发提供了实用指导。

aa123的博客 1005

维护O(1)时间查找最大元素的栈

问题描述:一个栈stack,具有push和pop操作,其时间复杂度皆为O(1)。设计算法max操作,求栈中的最大值,该操作的时间复杂度也要求为O(1)。 可以修改栈的存储方式,push,pop的操作,但是要保证O(1)的时间复杂度,空间时间复杂 度无要求。   可以创建一个类,类里有两个栈,一个栈S维持正常的push、pop操作,另一个Sm保存当前的最大值

YouGoer有果儿 1244

JAVA + 海康威视SDK + FFmpeg+ SRS 实现海康威视摄像头二次开发

海康威视SDK接入方案摘要 本文介绍了使用海康威视官方SDK开发物联网平台摄像头接入功能的完整方案。系统采用Java后端集成HCNetSDK控制摄像头,通过FFmpeg将RTSP流转为RTMP推送到SRS流媒体服务器,前端基于HTTP-FLV协议实现视频播放。文章详细说明了开发准备工作,包括SDK下载、SRS部署、FFmpeg安装等关键步骤,并提供了数据库表设计和接口定义。核心部分展示了如何集成海康SDK,包括提取必要代码、加载DLL文件、配置打包插件等具体实现细节,最终形成了一套支持实时预览、回放和下载的

2401_83057947的博客 2263

Hifiasm参数调优实战:当N50不理想时的7个排查方向与解决方案

本文详细解析了Hifiasm参数调优实战,针对基因组组装中N50不理想的7个排查方向与解决方案。通过调整--hom-cov、-D、-N等核心参数,结合HiFi数据和参考基因组分析,有效提升组装质量。文章以猪毛菜基因组为例,展示了从2.1MB到4.3MB的N50优化过程,为生物信息学研究者提供实用指南。

weixin_30642561的博客 425

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

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

Acx7的博客 1952

C++ PCL点云处理实战专栏

工业级点云处理技术学习资源,涵盖电力、建筑、隧道等领域的实战案例。内容分为三阶段:代码原理(算法认知)、动态库(项目验证)和完整代码(定制开发)。

weixin_45196569的博客 1117

随笔:实现一个队列,使得取出最大值的时间复杂度较低

该题是《编程之美》中的题目,最后提供的方法看起来挺好玩的,书里的代码看起来好像实现不了,做了下小调整,整成java的,测试可以实现功能。取出最大值的时间复杂度为O(1)。 这个题有几种解法,如引入最大堆,这样取出最大值的时间复杂度为O(1),入队列和出队列的时间复杂度要O(log2N) 提供一种解法: 用栈结构实现取出最大值功能比较简单,而用两个栈可以实现一个队列的功能,所以这道题就用两个具

KeepThinking_的专栏 2681

UG\NX二次开发 使用UF_CURVE_create_ocf_feature函数创建“在面上偏置”特征

使用UF_CURVE_create_ocf_feature函数创建“在面上偏置”特征。

王牌飞行员_里海的博客 850

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(取栈中最小值)、Max(取栈中最大值)的时间复杂度为O(1)。

文章目录栈刷题——求栈中的最小值和最大值,时间复杂度为O(1)题目描述:解题思路:代码解决:栈的结构设计初始化栈压栈出栈得到最大值得到最小值全部代码效果展示: 栈刷题——求栈中的最小值和最大值,时间复杂度为O(1) 题目描述: 实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(取栈中最小值)、Max(取栈中最大值)的时间复杂度为O(1)。 解题思路: 使用三个栈来解决。一个正常栈,一个最小值栈,一个最大值栈 每个元素进栈的时候, 除了第一个元素三个栈都进入的 比较这个元素和最小栈的栈顶的元素和最

weixin_51574797的博客 1107

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

实现O(1)时间复杂度带有min和max 函数的栈

只是演示实现,不考虑栈使用的数据结构是vector 还是其他容器。

学无止境 3828

SAP B1中文培訓教材_SDK

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

设计一个栈实现最大值函数

/** 设计一个栈结构,使得取出栈中最大值时间复杂度为O(1) 就是开辟多一个存储最大值索引的栈,该栈和存储数据的栈保持同步,即栈顶指针同时作用这两个栈。 */ #include using namespace std; class myStack { public: myStack() { MAX = 10;//栈的容量 top = -1;//oriSTack和ma

SUMUP 1157

构造一个栈,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

设计一个栈结构,满足一下条件:min,push,pop操作的时间复杂度为O(1)

//stackAPI.h#ifndef _STACK_API_H#define _STACK_API_H#define  SIZE 100#include #include void createRandArr(int *randArr, int len);templateclass myStack{private:T srcData[size];T maxData[size];T minData[size];int topIndex;int maxIndex;int minIndex;public:myS

辉仔 の专栏 3919

如何用 O(1) 的时间复杂度求栈中最小元素 (java 语言描述)

栈具有后进先出的特点,因此 push 和 pop 只需要对栈元素进行操作。通过遍历来查找最小元素的时间复杂度为 O(1) ,那么如何才能用 O(1) 的时间复杂度求栈中最小元素呢? 采用空间来换取时间的方式来提高时间复杂度。具体实现为,使用两个栈结构,一个栈用来存储数据,另一个用来存储最小元素,当新加入的数据比最小元素还要小,就把这个元素压如最小栈中,出栈时,如果出栈元素是当前最小元素,那么把最...

Lud的博客 467

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

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

Acx7的博客 148

栈结构实战与最大元素高效查询

摘要:本文探讨栈数据结构的基本概念与应用场景,重点分析栈操作(入栈、出栈、最大值查询)的时间复杂度问题。针对原始方案中最大值查询效率低(O(n))的缺陷,提出双栈优化法,通过辅助栈同步维护当前最大值,将查询时间降至O(1)。性能测试显示优化方案效率提升15倍(10^5次操作耗时从2.3秒降至0.15秒)。文章还给出工程实践建议(预分配、异常处理、模板化)和相关LeetCode题目拓展,完整呈现了从理论分析到实践优化的栈结构实现方法。

qq_16759367的博客 707

队列中取最大值操作问题

问题出处:《编程之美》3.7队列中取最大值操作问题 假定有这样一个拥有3个操作的队列: 1. EnQueue(v): 将v加入队列中 2. DeQueue(): 使队列中的队首元素删除并返回此元素 3. MaxElement(): 返回队列中的最大值 请设计一种数据结构和算法,让MaxElement()操作的时间复杂度尽可能的低。 常规思路:利用一个数组或者链表来存储队

CaryaLiu的专栏 7186

22 | 栈与单调栈:最大矩形面积

上节课我们讲了单调队列这种具有单调性的结构,并且说明了单调队列适合:维护中的区间最大值,并且我还提到单调队列只是一个铺垫,搞清楚了单调队列的内容,才能更好地学习新的数据结构。今天将带你学习一种队列和单调队列的兄弟数据结构,它的性质也很有趣,就是:栈与单调栈。学习这个数据结构的时候呢,我还是要再次强调一下那句话:数据结构,就是定义一种性质,并且维护这种性质。

qq_37756660的博客 1343

(c++)(超简单)剑指offer:包含min函数的栈。和队列的最大值

第一反应大概都是入栈后排序。。。 然鹅这样就损坏了栈结构。。。 后进先出的规律就凉了。 辅助栈它来了! 年度最佳备胎。 在代码中备胎定义为second。 入栈的时候 辅助栈要执行降序排列,小的在上面。 当然如果是空栈,直接进去!如果将要入栈的元素比已有的栈顶元素大,不执行入栈操作。 (主栈这个元素入栈了,以后再弹出,对辅助栈的最小元素无影响,本来它就很大嘛)。 出栈的时候 要注意,万一碰巧了,这时候两个栈的栈顶元素相同(也是最小的,毕竟辅助栈栈顶最小嘛),恰恰下一步执行弹出操作,那么介个最小元素是不是就没了

weixin_44540543的博客 200
上一篇: 求两个DNA的距离-最短编辑距离变形
下一篇: 随笔:实现一个队列,使得取出最大值的时间复杂度较低
KeepThinking_
博客等级 码龄15年 50粉丝 39原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值