单调栈小结
程序员文章站
2022-07-08 09:50:18
单调栈 单调栈是解决这样一类问题 给出$n$个数,问每一个数向左第一个比它小的数是谁 如果直接暴力的话,最坏情况下肯定是$O(n^2)$的,但是单调栈可以在$O(n)$的时间内解决这类问题 实现 单调栈,顾明思议嘛,就是维护一个具有单调性的栈,至于是单调递增还是单调递减,这个视题目而定 对于上面那个 ......
单调栈
单调栈是解决这样一类问题
给出$n$个数,问每一个数向左第一个比它小的数是谁
如果直接暴力的话,最坏情况下肯定是$O(n^2)$的,但是单调栈可以在$O(n)$的时间内解决这类问题
实现
单调栈,顾明思议嘛,就是维护一个具有单调性的栈,至于是单调递增还是单调递减,这个视题目而定
对于上面那个问题而言,我们需要维护一个单调上升的序列
加入一个元素的时候,若当前元素比栈顶元素小,那么就不断的弹出栈顶元素,直到整个栈满足单调
那么该位置向左第一个比它小的就是栈顶
上面说的太抽象了
比如,我们有一个序列$2,4,3,5,2$
设$ans[i]$表示第$i$个位置的答案
$2$加入序列,此时序列为$2$,$ans[1]=0$
$4$加入序列,此时序列为$2,4$,$ans[2]=2$
$3$加入序列,我们发现,如果将$3$直接加入序列,此时序列将不满足单调性,于是先删除$4$,再加入$3$,此时序列为$2,3$,$ans[3]=2$
$5$加入序列,此时序列为$2,3,5$,$ans[4]=5$
$2$加入序列,删除$2,3,5$,加入$2$,此时序列为$2$,$ans[5]=0$
考虑每一个元素最多被加入/删除一次,因此时间复杂度为$O(n)$
至于为什么,感觉挺显然的吧,就是利用单调性
例题
都是些水题
有些难度,用到了单调栈的思想
上一篇: Keil MDK V5.32 和 V5.31 对比,及价格
下一篇: App推广渠道及形势简介
推荐阅读
-
mysql 忘记密码的解决方法(linux和windows小结)
-
Windows 64 位 mysql 5.7以上版本包解压中没有data目录和my-default.ini及服务无法启动的快速解决办法(问题小结)
-
Android studio 3.0上进行多渠道打包遇到的问题小结(超简洁版)
-
android studio 3.0 升级 项目遇到的问题及更改思路(问题小结)
-
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
-
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
-
5分钟学会Vue动画效果(小结)
-
Python编程实现双链表,栈,队列及二叉树的方法示例
-
Python栈算法的实现与简单应用示例
-
用PHP解决的一个栈的面试题