單調棧是解決這樣一類問題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)$
至於爲何,感受挺顯然的吧,就是利用單調性
都是些水題
有些難度,用到了單調棧的思想