线性结构 —— 单调栈与单调队列
【单调栈】
1.原理
单调栈,就是栈内元素保持一定单调性(单调递增或单调递减)的栈,即从栈底到栈顶单调递增或递减。
对于单调递增的栈,如果栈为空或入栈元素值大于等于栈顶元素值,则入栈;否则,若入栈会破坏栈的单调性,因此需要将比入栈元素大的元素全部出栈。
对于单调递减的栈,如果栈为空或入栈元素值小于等于栈顶元素值,则入栈;否则,若入栈会破坏栈的单调性,因此需要将比入栈元素小的元素全部出栈。
以下图单调递减的栈为例,从栈顶到栈底初始元素为:6、4、2、1
当插入的元素小于等于栈顶元素时,满足单调递减的条件,可直接加入栈,例如:插入元素 0,可直接加到栈顶
当插入的元素大于等于栈顶元素时,为满足单调递减的性质,需要从栈顶开始,将比入栈元素小的值全部弹出再入栈,例如:插入元素 3,需要先将 1、2 弹出
2.应用
单调栈常用的应用有:
- 给定一组数,对于某个数,找到从左/右遍历第一个比它小/大的元素的位置
- 给定一组数,针对每个数,寻找其与其左/右第一个比它小/大的数之间有多少个数
- 给定一序列,寻找某一子序列,使得子序列中的最小值乘以子序列的长度最大
- 给定一序列,寻找某一子序列,使得子序列中的最小值乘以子序列所有元素和最大
3.实现
1)单调递增栈
stack<int> S;for(int i=1;i<=n;i++){while(!S.empty()&&a[S.top()]>a[i]){//栈不为空且栈顶元素大于入栈元素时S.pop();//将栈顶大于入栈元素的元素出栈...//更新结果}S.push(i);//元素入栈
}
2)单调递减栈
stack<int> S;for(int i=1;i<=n;i++){while(!S.empty()&&a[S.top()]<a[i]){//栈不为空且栈顶元素小于入栈元素时S.pop();//将栈顶小于入栈元素的元素出栈...//更新结果}S.push(i);//元素入栈
}
【单调队列】
1.原理
单调队列就是从队首到队尾满足单调性的队列,与单调栈极其相似,其基本原理与单调栈相同,只需将单调栈先进后出的性质改为先进先出的性质即可。
对于单调递增的队列,若队列为空或入队元素 x 大于等于队尾元素,则入队;否则,入队会破坏队列的单调性,因此需要将队尾中比入队元素 x 大的元素全部出队。
对于单调递减的队列,若队列为空或入队元素 x 小于等于队尾元素,则入队;否则,入队会破坏队列的单调性,因此需要将队尾中比入队元素 x 小的元素全部出队。
2.应用
单调队列的常用应用有:
- 给出一组数,求这组数中第一个大/小于等于一个数 x 的数
- 维护单调性,从而解决区间内最小/大的问题
- 解决滑动窗口问题
- 优化多重背包 DP、斜率优化 DP
3.实现
单调队列一般使用 STL 的 deque(双端队列) 实现即可,由于双端队列即可再队首操作又可在队尾操作,那么这样的性质就弥补了单调栈只可在尾端操作的不足,使得首段也有了一定的限制。
1)单调递增队列
deque<int> Q://双端队列
for(int i=1;i<=n;i++){while((!Q.empty())&&Q.back()>A[i]){//队列不为空且队尾元素大于入队元素时Q.pop_back();//将队列尾端大于入队元素的元素出队...//更新结果}q.push_back(A[i]);//元素入队...//更新结果
}
2)单调递减队列
deque<int> Q://双端队列
for(int i=1;i<=n;i++){while((!Q.empty())&&Q.back()<A[i]){//队列不为空且队尾元素小于入队元素时Q.pop_back();//将队列尾端小于入队元素的元素出队...//更新结果}q.push_back(A[i]);//元素入队...//更新结果
}
【例题】
- City Skyline(POJ-3044)(单调栈):点击这里
- Bad Hair Day(POJ-3250)(单调栈):点击这里
- Largest Rectangle in a Histogram(HDU-1506)(左右两次单调栈):点击这里
- Passing the Message(HDU-3410)(左右两次单调栈):点击这里
- Non-negative Partial Sums(HDU-4193)(单调队列):点击这里
- Second My Problem First(HDU-3706)(单调队列):点击这里
- Beauty Of Unimodal Sequence(HDU-6592)(LIS+单调栈):点击这里
线性结构 —— 单调栈与单调队列相关推荐
- 【数据结构】单调栈和单调队列 详解+例题剖析
算法:单调栈和单调队列 一.单调栈和单调队列 二.单调栈例题 1.模板题入门 2.不懂不要急,看这道题 三.单调队列例题 1.入门 2.进阶 一.单调栈和单调队列 单调栈和单调队列与普通的栈,队列不同 ...
- 刷题关键点总结-单调栈、单调队列
单调栈,单调队列顾名思义,栈内或者队列内元素具有一致下降或者一致上升的特点. 选用单调栈或者队列的出发点: 使用单调栈或者单调队列一般具有三个出发点: 1.求栈或队列内某个元素左侧或者右侧第一个比它大 ...
- 单调栈与单调队列简单例题
单调栈与单调队列简单例题 单调栈: POJ3250 题意:有n只奶牛排成一列向右看,每头奶牛只能看到比自己矮的奶牛,即会被高的奶牛挡住后面,问共有多少只奶牛能被看到 思路:考虑每头奶牛能被前面牛看到的 ...
- 模板_单调栈_AcWing_830. 单调栈_底顶递增栈
模板_单调栈_AcWing_830. 单调栈_底顶递增栈 830. 单调栈 题目 提交记录 讨论 题解 视频讲解 给定一个长度为 NN 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 − ...
- 栈和队列都是限制存取点的线性结构_栈的练习以及解析
The Practice Of Stack栈的练习01 栈是(). A.顺序存储的线性结构 B.链式存储的非线性结构 C.限制存取点的线性结构 D.限制存储点的非线性结 答案:B 解析 ...
- 数据结构 - 单调栈、单调队列
单调栈:每日温度 请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度.如果气温在这之后都不会升高,请在该位置用 0 来代替 单调栈基本只处理NGE问题(Nex ...
- 单调栈和单调队列的应用即总结
单调栈 基本概念 单调栈的基础结构是"栈",即元素是LIFO的,只能从栈顶控制数据出入:单调表示从栈的一端到另一端遍历,元素是单调递增或者单调递减的.比如单调递减栈,从栈底到栈顶的 ...
- 单调栈是单调递增还是单调递减?
一言以蔽之,最后的需求是什么,单调栈的单调性就是什么. 如果要找第一个小于的元素,单调栈即为递增:找第一个大于的元素,单调栈即为递减.当前元素与目标元素的大小关系就是单调栈内部元素的大小关系.
- 【c++刷题Day2】专题3栈与队列单调栈与单调队列T3
这是C++刷题的Day2
最新文章
- 专访王田苗:机器人是“刚需”,市场正处于逆周期增长
- centOS7 Minima无法上网解决方案(Linux设置开机自动获取ip地址)
- 光照传感器哪个好_传感器2—光敏传感器
- MOSS Content Types 概述
- springboot thymeleaf 引入jquery_超详细实战:SpringBoot高级之autoconfigure自动化配置
- Windows下自动备份Oracle数据库
- rabbitmq原理总结,Java反射的简单入门
- 质性研究工具_MAXQDA在质性数据分析中的使用——免费的中文在线研讨会!
- Python垃圾回收(gc)拖累了程序执行性能?
- 应用程序的可视化图形引擎库控件Vectordraw Developer Framework
- 计算机的flash player在哪里,flash player电脑设置管理器在哪?怎么打开
- 服务器数据恢复案例:FreeNAS数据恢复过程记录
- pdf文件怎么转换成图片
- 外星人笔记本计算机在哪里,笔记本电脑没声音,教您外星人笔记本没声音如何解决...
- visual studio code打开预览.md文件
- 第一周python学习
- Beautifulsoup官方文档
- 游戏时间 (10 分)
- 活动目录 kerberos 身份验证的过程 组策略
- 三菱FX5U通过CCLINK IE Basic网络控制JET伺服FB功能块使用说明