单调栈是解决这样一类问题php
给出$n$个数,问每个数向左第一个比它小的数是谁html
若是直接暴力的话,最坏状况下确定是$O(n^2)$的,可是单调栈能够在$O(n)$的时间内解决这类问题spa
单调栈,顾明思议嘛,就是维护一个具备单调性的栈,至因而单调递增仍是单调递减,这个视题目而定htm
对于上面那个问题而言,咱们须要维护一个单调上升的序列blog
加入一个元素的时候,若当前元素比栈顶元素小,那么就不断的弹出栈顶元素,直到整个栈知足单调get
那么该位置向左第一个比它小的就是栈顶时间
上面说的太抽象了mq
好比,咱们有一个序列$2,4,3,5,2$co
设$ans[i]$表示第$i$个位置的答案block
$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)$
至于为何,感受挺显然的吧,就是利用单调性
都是些水题
有些难度,用到了单调栈的思想