单调栈与单调队列
单调栈
数组/栈中的数满足单调性质(递增或递减),可查询
实现:(以单调上升举例)
将数按顺序压入栈中,若新压入的数小于前一个数(不满足单调性),则弹出前一个数,继续向前比较,直至满足大于前一个数(满足单调性)时将此数入队。
代码:
while(s[now] < a[i]){ //不满足条件
now --; //弹出
} s[++ now] = a[i]; //入栈
应用:
常用于寻找一个数右侧第一个大于或是小于它的数。或是用于优化 dp 的效率。
习题:
Patrik 音乐会的等待
单调队列
类似于单调栈,但可控制区间长度,不一定是单调栈的
实现:
在单调栈的基础上添加控制左端点的变量。
代码:
l = 1; r = 0; //初始化左右端点位置
while(l <= r && a[i] > a[s[r]]){
r --; //弹出
}
s[++ r] = i; //入队
while(l <= r && s[l] + k <= i){ //若长度不满足限制
l ++; //左端点右移
}
应用:
常用于查询一段区间中的最大值或是最小值。
单调栈与单调队列
单调队列灵活性比单调栈更高,可控制查询区间。但在没必要控制时直接使用单调栈即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】