单调栈
1|0概述
栈中元素满足单调性的线性数据结构,单调栈一般维护的是一个数前/后第一个大于/小于他的数。
- 单调栈解决的主要问题是什么呢?
就跟单调队列差不多。单调队列主要处理的是一个区间内的最大/小值,而单调栈处理的是寻找以某个值为最小/大值的最大区间。相比较,实际上单调栈用的虽然少一些,但是比单调队列更加灵活多变。
- 为什么单调栈是正确的呢?
对于这道题来说,我们定义一个元素失效,当且仅当这个元素的
- 单调栈的时间复杂度是?
想一下,我们的每一个元素最多进栈/出栈一次,所以说时间复杂度 O(n)。
-
结束标识符
对于某些特殊题目,栈内元素出不完,会导致答案错误,这时候我们要添加结束标识符强制吐出所有栈内元素。
2|0板题
题意
即求每一个数的下一个更大数的下标。
思路
- 维护一个单调递减的栈,即栈顶永远是大于等于目前元素的最小值
- 每次插入元素与栈顶进行比较
- 大于等于栈顶
- 栈顶不停出栈,直到该元素小于栈顶或栈为空。
- 出栈的每一个栈顶,对应的答案都是该元素。
- 小于栈顶
- 入栈
- 大于等于栈顶
时间复杂度
从出栈入栈的角度切入分析,所有元素都只会出栈一次,入栈一次,所以复杂度就是
代码
3|0最大矩形面积
D-Largest Rectangle in a Histogram_0x11 基本数据结构-栈 (nowcoder.com)
思路
考虑维护每一个元素
显然可能的面积就是
代码
4|0CF1730C
题意
给定一个仅包含
选择字符串中的一个数字
求能够得到的字典序最小的字符串。
思路
想要让字典序最小,就要尽可能将小的数放在前面。每次执行一次操作后,我们都会让一个数变大,只有变大后把它放在字符串后面,让一个更小的数能到前面来,他才能更优。
维护一个单调栈,将弹出的元素 vector
中,将所有元素排序。最后输出答案,在输出单调栈中元素的同时,输出 vector
中与之相等的元素,因为已经排完序了,直接从前向后扫即可。
__EOF__

本文链接:https://www.cnblogs.com/kdlyh/p/17976128.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下