单调栈 and 单调队列学习笔记
单调栈 and 单调队列学习笔记
本文均以维护单调递增的栈/队列举例。
以后在写动态规划单调队列/单调栈优化的时候,这两个东西会合并。
单调栈
本质上就是模拟。
假设要维护一个单调递增的栈,那么对于一个元素进来了,在栈顶的所有比他小的数我全部都要踢出去,不然就不满足单调性。然后把这个数加到栈里面去。
这里维护的是下标,因为数比较大。不能进行标记。
维护一个单调递增栈,从后往前枚举,每次一个数进来就把小于等于他的数给踢出去,(由于要求第一个大于他的数,当前的位置 \(i\) 是相对于 \([1,i]\) 间的数更近的,相同的情况下 \(i\) 更优)。栈顶就是第一个比他大的数的下标了。
所以,在这个栈里面,数是单调递增的,下标也是单调递增的。故栈顶就是答案。
单调队列
和单调栈的本质基本上是一样的,如果维护一个单调递增的队列,那么一个数加进来的时候就把所有不符合单调性的数全部踢出去。
维护两个单调递增,单调递减队列,如果队列中有数的位置不符合窗口大小,就应该踢出去。
队首就是答案。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律