C++ 高级数据结构————[ 单调栈 ]

news2024/10/2 16:30:58

每周一篇的算法文章来了

今天讲解的是高级数据结构中的——单调栈

单调栈,顾名思义,就是升级版的栈()

先回顾一下栈把

,是一种线性表,它的特点是只能从一边进出,并且先进后出,后进先出。就想枪的弹夹一样。

而单调栈,跟他有一点不同

单调栈,每时每刻都要保持栈中呈现单调递增或单调递减 

但是,有一个问题:

还是举个栗子

如果把6,7,12,3,1,8依次入栈,那么就会呈现这种样子

 

 怎么看,他都不是单调递增或递减

那我们就要引入单调栈的方法了

一.单调递增栈

单调递增栈中的单调递增,指的是依次出栈的数据呈单调递增

就比如

 

在出栈时,顺序为1,2,3,4,5,6

回到刚才的栗子

如果要达到单调递增栈

顺序就是这样的:

首先,6入栈

 接着,7如果入栈,就不满足单调递增,所以要把6踢了,让7入栈

 然后12要入栈,把7踢了,保证单调性

 接着,3正常入栈,能够保持单调递增

 1也正常入栈

因为8要入栈,所以为了保持单调性,必须把1和3踢了

 

 最后的单调递增栈的样子

代码:

单调递增栈:找到右起第一个比当前数字大的元素

for (int i=T.size()-1;i>=0;i--){
    while(!st.empty()&&T[st.top()]<=T[i]){
        st.pop();
    }
    st.push(i);
}

二.单调递减栈

与单调递增栈相反,单调递减栈是按照出栈顺序来说从大到小

还是模拟一遍栗子:

首先6照常进栈

 7也是照常进栈,并且能保持单调递减性

 12也照常进栈

这时,3要进栈,为了保持单调性,必须把比他大的都踢出去,也就是所有

 

 因为1要进栈,并且保持单调性,所以踢了3

最后8照常进栈

 

 

整个的单调递减栈就是这样的

代码:

找出左起第一个小于等于当前数字的元素

for (int i=0;i<T.size();i++){
    while(!st.empty()&&T[st.top]>T[i]){
        st.pop();
    }
    st.push(i);
}

作用:

单调栈可以以O(n)的时间复杂度求出某个数的左边第一个比他小于的或右边第一个比他大于的

例题:

题目描述

给出项数为n的整数数列a1…n。定义函数 f(i) 代表数列中第 i个元素之后第一个大于 ai 的元素的下标,即 f(i)=mini<j<=n, aj>ai{j}。若不存在,则f(i)=0,试求出 f(1…n) 

输入

第一行一个正整数n,第二行n个正整数 a1…n。

输出

一行n个整数f(1…n)的值。

 

样例输入1
5
1 4 2 3 5
样例输出1
2 5 4 5 0

单调递增栈的模板题

# include <iostream>
# include <cstdio>
# include <algorithm>
# include <stack>
using namespace std;
# define int long long
int n,a[3000005],f[3000005];
stack <int> s;
signed main(){
	scanf("%lld",&n);
	for (int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	for (int i=n;i>=1;i--){
		while(!s.empty()&&a[s.top()]<=a[i]){
			s.pop();
		}
		f[i]=s.empty()?0:s.top();
		s.push(i);
	}
	for (int i=1;i<=n;i++){
		printf("%lld ",f[i]);
	}
	return 0;
}

---------------------------------------------------------------------------------------------------------------------------------

今天对单调栈的讲解就到这里

有什么问题大家可以随时评论区讨论

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/436856.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows入门篇一之MSDN手册的使用和第一个窗口程序

Windows入门篇之MSDN手册的使用和第一个窗口程序 MSDN手册MSDN手册是什么MSDN手册的下载和安装MSDN手册的使用 第一个窗口程序项目的创建第一个简单的窗口程序 MSDN手册 MSDN手册是什么 MSDN手册是VS中的一个帮助手册&#xff0c;帮助初学者学习Windows编程&#xff0c;来查找…

opencv实现卡尔曼滤波

卡尔曼滤波是一种递归的估计&#xff0c;即只要获知上一时刻状态的估计值以及当前状态的观测值就可以计算出当前状态的估计值&#xff0c;因此不需要记录观测或者估计的历史信息。 卡尔曼滤波器分为两个阶段&#xff1a;预测与更新。在预测阶段&#xff0c;滤波器使用上一状态…

VScode配置远端服务器深度学习项目

前提准备已安装VScode。 1.安装插件Remote Development 安装完成后左侧就多了远程资源管理器图标&#xff1a; 1.点击远程资源管理器。 2.点击小齿轮&#xff08;配置&#xff09;。 3.选择config配置文件&#xff0c;如果没有自己按照相似路径新建config文件后重复1、2、3步骤…

组合总和III

组合总和III 题目 力扣题目链接:https://leetcode.cn/problems/combination-sum-iii/ 代码 class Solution {public:vector<vector<int

小航助学答题系统编程等级考试scratch一级真题2023年3月(含题库答题软件账号)

青少年编程等级考试scratch真题答题考试系统请点击 电子学会-全国青少年编程等级考试真题Scratch一级&#xff08;2019年3月&#xff09;在线答题_程序猿下山的博客-CSDN博客_小航答题助手 1.下列说法不正确的是&#xff1f;&#xff08; &#xff09; A.可以从声音库中随机…

【JSP学习笔记】7.JSP 过滤器

JSP 过滤器 JSP 和 Servlet 中的过滤器都是 Java 类。 过滤器可以动态地拦截请求和响应&#xff0c;以变换或使用包含在请求或响应中的信息。 可以将一个或多个过滤器附加到一个 Servlet 或一组 Servlet。过滤器也可以附加到 JavaServer Pages (JSP) 文件和 HTML 页面。 过…

20230419 | 704.二分查找、27.移除元素

1、数组基础理论 int a[m][n]; 数组长度表示&#xff1a;a[0].length 数组宽度表示&#xff1a;a.length 2、704.二分查找 特征&#xff1a;数组是升序的找某个数&#xff0c;那就使用二分法。时间复杂度O(log n)&#xff0c;空间复杂度O(1) 我使用左闭右闭区间 计算中点&…

22、原理解析

文章目录 1、Profile功能1、application-profile功能2、Profile条件装配功能3、profile分组 2、外部化配置1、外部配置源2、配置文件查找位置3、配置文件加载顺序&#xff1a;4、指定环境优先&#xff0c;外部优先&#xff0c;后面的可以覆盖前面的同名配置项 3、自定义starter…

P600旗舰视觉款正式发布,重新定义视觉追踪与精准定位!

P600旗舰视觉款无人机是一款准行业级无人机&#xff0c;搭载RTK定位系统&#xff0c;定位精度可达厘米级&#xff0c;飞行路径更精准、姿态更稳定&#xff1b;机身搭载Allspark机载计算机&#xff0c;算力可达21TOPS&#xff0c;可运行大部分主流算法&#xff1b;配置G1三轴吊舱…

共模电感是如何抑制共模信号的

这是一个共模电感&#xff0c;外观它和我们常用的电感最大的区别就是共模电感有四个引脚&#xff0c;共模电感的磁芯上绕着两组线圈&#xff0c;这两个线圈匝数和材料都是一样的。 共模电感最主要的作用就是能抑制共模信号&#xff0c;一般用在电源或信号的EMI电路中。 首先来…

【ROS实操3服务调用添加乌龟数量】

需求描述 编码实现向turtlesim 发送请求&#xff0c;在乌龟显示节点的窗体指定位置生成一乌龟&#xff0c;这是一个服务请求操作。 实现分析 1.首先&#xff0c;需要启动乌龟显示节点。 2.要通过ROS命令&#xff0c;来获取乌龟生成服务的服务名称以及服务消息类型。 3.编写服…

C++基础入门——语法详解篇(上)

文章目录 一、什么是 C 呢&#xff1f; 二、为什么要学 C 呢&#xff1f; 三、C 基础语法 3、1 C 关键字 3、2 命名空间 3、2、1 为什么要引入命名空间 3、2、2 命名空间的定义 3、2、3 命名空间的使用 3、3 C的输入和输出 3、4 函数重载 3、4、1 函数重载的概念 3、4、2 C支持…

【WAF】雷池安装及使用体验

文章目录 前言一、雷池介绍二、安装及使用1.下载链接2.下载3. 安装waf测试 前言 长亭一直是我比较喜欢的一家公司&#xff0c;像业界比较出名的扫描器xray还有rad等很多工具都是他们开发的&#xff0c;使用起来非常的nice&#xff0c;联动其他安全工具可以实现自动漏洞挖掘&am…

掌玩科技×OceanBase:HTAP实时数据分析,降低80%存储成本

欢迎访问 OceanBase 官网获取更多信息&#xff1a;https://www.oceanbase.com/ 近日&#xff0c;新兴游戏公司海南掌玩网络科技有限公司&#xff08;以下简称“掌玩科技”&#xff09;正式牵手原生分布式数据库 OceanBase&#xff0c;其投放系统、用户分析系统、数据系统、运营…

beef-xss浏览器劫持

beef-xss浏览器劫持 一&#xff0c;实验拓扑图二&#xff0c;租用一台阿里云&#xff0c;搭建docker环境和beef环境1.租一台阿里云服务器&#xff0c;系统选用ubuntu&#xff0c;计时收费的那种&#xff0c;一个小时几毛钱2.开启策略组3000端口&#xff0c;5000端口4.安装docke…

wait/notify使用详解

1. 使用注意事项 wait/notify(All)可用于线程间(线程数量>3)通信 永远在synchronized方法或对象里使用wait/notify(All),不然JVM报java.lang.IllegalMonitorStateException 永远在while循环里使用wait&#xff0c;防止其他原因改变先前判断条件 永远在线程间共享对象(生产…

直流有刷电机的电路分析

这里写目录标题 H桥改进后的电路L298N原理图野火的电机驱动板MOS管野火的原理图 H桥 当 Q1 和 Q4 导通时&#xff0c;电流将经过 Q1 从左往右流过电机&#xff0c;在经过 Q4 流到电源负极&#xff0c;这时图中电机可以顺时针转动。 当 Q3 和 Q2 导通时&#xff0c;电流将经过 Q…

【AI算法学习】基于AutoEncoder的生成对抗网络

基于AutoEncoder的生成对抗网络&#xff1a;VAE-GAN AutoEncoderVAEGANVAE-GANDCGANInfoGANss-InfoGAN论文链接 " 生成模型&#xff08;Generative modeling&#xff09;"已成为机器学习的一个较为广泛的领域。在图像这种流行数据上&#xff0c;每张图像都有数千数万…

服务(第七篇)nginx优化

隐藏版本号&#xff1a; 方法①&#xff1a; 修改配置文件&#xff1a; 检测&#xff1a;版本号没有了 方法②&#xff1a; 首先修改nginx.h文件&#xff0c;修改版本号和服务名&#xff1a; 然后切换到/opt/nginx-1.18.0进行编译安装&#xff1a; 安装后进入nginx.conf进行…

Redis缓存实战(2)

目录 缓存定义 Redis缓存实战 1删除缓存还是更新缓存&#xff1f; 2如何保证缓存与数据库的操作同时成功或者失败&#xff1f; 3先操作数据库还是缓存&#xff1f; 缓存问题 缓存穿透 缓存雪崩 缓存击穿 缓存定义 缓存&#xff08;Cache)是数据交换的缓冲区&#xff0…