單調棧小結

單調棧

單調棧是解決這樣一類問題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)$

 

至於爲何,感受挺顯然的吧,就是利用單調性

 

例題

都是些水題

洛谷P2688

題解

 

HDU1506

題解

 

BZOJ1007

有些難度,用到了單調棧的思想

題解

相關文章
相關標籤/搜索