定義
從棧底元素到棧頂元素呈單調遞增或單調遞減,棧內序列滿足單調性的棧。
原理
(1)當新元素在單調性上優於棧頂時(單增棧新元素比棧頂大,單減棧新元素比棧頂小),壓棧,棧深+1;
(2)當新元素在單調性與棧頂相同(新元素於棧頂相同)或劣於棧頂時(單增棧新元素比棧頂小,單減棧新元素比棧頂大),彈棧,棧深-1;
注:棧裡存的是位序,比較的是位序對應的值
例如:
152功能例如:求序列1 5 2 3 7 4中,每個元素左邊第乙個嚴格小於本身的值的位置374值 序號
1-->5
1-->2
1-->2
1-->3
1-->2-->3
1-->3-->4
1-->2-->3-->7
1-->3-->4-->5
1-->2-->3-->4
1-->3-->4-->6
其實答案就在上面,就是插入當前值時棧頂的值。
但其正確性卻不好證明
這樣看,如果乙個元素其右邊有更小的數,該元素一定會被彈出棧(為什麼可以這樣?因為找到更小的了,該元素對後面的就沒有影響了)。
這樣「去雜」以後棧就是單調的了,如果棧頂元素小於當前元素,棧頂的值就答案,當前元素入棧(可能有用,對後面還有影響);如果大於或等於,用當前元素更新棧,停下來的地方也正好是答案(單調,左邊更小,所以當前是第乙個最小)。
模板
得到序列中n個元素向左遍歷的第乙個比它小的數的位置
1例題largest rectangle in a histogram (poj no.2599)const
int maxn = 100000 + 10;2
intn,a[maxn];
3int
l[maxn];45
void
solve()
615 }
柱狀圖是由一些寬度相等的長方形下端對齊後橫向排列得到的圖形。現有由n個寬度為1,高度分別為h1、h2...hn的長方形從左到右依次組成的長方形。問裡面包含的長方形的最大面積是多少。
例如:n = 7,h =
**實現
1 #include2 #include3 #include4using
namespace
std;56
const
int maxn = 100000 + 10;7
intn,hi[maxn];
8int
l[maxn],r[maxn];910
void
l_solve() //得到l[i]
1120}21
22void
r_solve() //得到r[i]
2332}33
34int
main()
3547 printf("
%lld\n
", ans);48}
49return0;
50 }
單調棧 模板 單調棧模板
biu 單調棧主要用於求取左邊第乙個比它大,或者比它小的數。就比如站隊隨便排成一列,可以求到每個人後面第乙個比他高的人。同理可以推廣至右邊,比它矮均可。這就是單調遞增棧 遞減棧,從前至 棧,從後向前入棧的區別了。單調棧比較抽象,非常具有智慧型的想法,可應用的場景相當少,根據幾個經典題目體會它的用法會...
C 單調棧使用總結
相關leetcode題目 496.下乙個更大元素 i 503.下乙個更大元素 ii 556.下乙個更大元素 iii 31.下乙個排列 739.每日溫度 這類題最終要求的結果都是比當前元素更大的下乙個元素的位置 求解思路 就比如上學做操時的排隊,如果你向後望去一馬平川,說明後面沒有比你更高的人,如果後...
單調佇列 單調棧
參考文章 單調佇列 poj 2823 給定乙個數列,從左至右輸出每個長度為m的數列段內的最小數和最大數。數列長度 n 106 m n n 106,m n n 106 m n 直接暴力求解複雜度在0 mn 可以考慮維護區間最值,單調佇列則是維護區間佇列的強大 單調佇列的定義 單調佇列實現的大致過程 1...