【单调栈】

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. 【数据结构】单调栈和单调队列 详解+例题剖析

    算法:单调栈和单调队列 一.单调栈和单调队列 二.单调栈例题 1.模板题入门 2.不懂不要急,看这道题 三.单调队列例题 1.入门 2.进阶 一.单调栈和单调队列 单调栈和单调队列与普通的栈,队列不同 ...

  2. 刷题关键点总结-单调栈、单调队列

    单调栈,单调队列顾名思义,栈内或者队列内元素具有一致下降或者一致上升的特点. 选用单调栈或者队列的出发点: 使用单调栈或者单调队列一般具有三个出发点: 1.求栈或队列内某个元素左侧或者右侧第一个比它大 ...

  3. 单调栈与单调队列简单例题

    单调栈与单调队列简单例题 单调栈: POJ3250 题意:有n只奶牛排成一列向右看,每头奶牛只能看到比自己矮的奶牛,即会被高的奶牛挡住后面,问共有多少只奶牛能被看到 思路:考虑每头奶牛能被前面牛看到的 ...

  4. 模板_单调栈_AcWing_830. 单调栈_底顶递增栈

    模板_单调栈_AcWing_830. 单调栈_底顶递增栈 830. 单调栈 题目 提交记录 讨论 题解 视频讲解 给定一个长度为 NN 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 − ...

  5. 栈和队列都是限制存取点的线性结构_栈的练习以及解析

    The Practice Of Stack栈的练习01 栈是(). A.顺序存储的线性结构     B.链式存储的非线性结构 C.限制存取点的线性结构     D.限制存储点的非线性结 答案:B 解析 ...

  6. 数据结构 - 单调栈、单调队列

    单调栈:每日温度 请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度.如果气温在这之后都不会升高,请在该位置用 0 来代替 单调栈基本只处理NGE问题(Nex ...

  7. 单调栈和单调队列的应用即总结

    单调栈 基本概念 单调栈的基础结构是"栈",即元素是LIFO的,只能从栈顶控制数据出入:单调表示从栈的一端到另一端遍历,元素是单调递增或者单调递减的.比如单调递减栈,从栈底到栈顶的 ...

  8. 单调栈是单调递增还是单调递减?

    一言以蔽之,最后的需求是什么,单调栈的单调性就是什么. 如果要找第一个小于的元素,单调栈即为递增:找第一个大于的元素,单调栈即为递减.当前元素与目标元素的大小关系就是单调栈内部元素的大小关系.

  9. 【c++刷题Day2】专题3栈与队列单调栈与单调队列T3

    这是C++刷题的Day2

最新文章

  1. 专访王田苗:机器人是“刚需”,市场正处于逆周期增长
  2. centOS7 Minima无法上网解决方案(Linux设置开机自动获取ip地址)
  3. 光照传感器哪个好_传感器2—光敏传感器
  4. MOSS Content Types 概述
  5. springboot thymeleaf 引入jquery_超详细实战:SpringBoot高级之autoconfigure自动化配置
  6. Windows下自动备份Oracle数据库
  7. rabbitmq原理总结,Java反射的简单入门
  8. 质性研究工具_MAXQDA在质性数据分析中的使用——免费的中文在线研讨会!
  9. Python垃圾回收(gc)拖累了程序执行性能?
  10. 应用程序的可视化图形引擎库控件Vectordraw Developer Framework
  11. 计算机的flash player在哪里,flash player电脑设置管理器在哪?怎么打开
  12. 服务器数据恢复案例:FreeNAS数据恢复过程记录
  13. pdf文件怎么转换成图片
  14. 外星人笔记本计算机在哪里,笔记本电脑没声音,教您外星人笔记本没声音如何解决...
  15. visual studio code打开预览.md文件
  16. 第一周python学习
  17. Beautifulsoup官方文档
  18. 游戏时间 (10 分)
  19. 活动目录 kerberos 身份验证的过程 组策略
  20. 三菱FX5U通过CCLINK IE Basic网络控制JET伺服FB功能块使用说明

热门文章

  1. 世界一流大学的计算机专业,在用哪些书当教材?
  2. STM32分散加载文件
  3. 我滴个乖乖,我复现了Spring的漏洞,害怕!
  4. 表弟面试被虐,我教他缓存连招,借机蹭了波奈雪的茶
  5. 牛X,试用了下GitHub上22万Star的第一抢票神器,3秒钟抢到!
  6. 从链表中删除数据的时间复杂度真的是O(1)吗?
  7. 华为发布会: 牛逼鸿蒙,吹水的大会
  8. 再见,Eclipse
  9. 菜鸟技术专家胡斌:技术架构的战略和战术原则
  10. 根据hibernate拦截器实现可配置日志的记录