單調棧的使用

2022-05-02 11:24:14 字數 1772 閱讀 7881

定義

從棧底元素到棧頂元素呈單調遞增或單調遞減,棧內序列滿足單調性的棧。

原理

(1)當新元素在單調性上優於棧頂時(單增棧新元素比棧頂大,單減棧新元素比棧頂小),壓棧,棧深+1;

(2)當新元素在單調性與棧頂相同(新元素於棧頂相同)或劣於棧頂時(單增棧新元素比棧頂小,單減棧新元素比棧頂大),彈棧,棧深-1;

注:棧裡存的是位序,比較的是位序對應的值

例如:

152

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

功能例如:求序列1 5 2 3 7 4中,每個元素左邊第乙個嚴格小於本身的值的位置

其實答案就在上面,就是插入當前值時棧頂的值。

但其正確性卻不好證明

這樣看,如果乙個元素其右邊有更小的數,該元素一定會被彈出棧(為什麼可以這樣?因為找到更小的了,該元素對後面的就沒有影響了)。

這樣「去雜」以後棧就是單調的了,如果棧頂元素小於當前元素,棧頂的值就答案,當前元素入棧(可能有用,對後面還有影響);如果大於或等於,用當前元素更新棧,停下來的地方也正好是答案(單調,左邊更小,所以當前是第乙個最小)。

模板

得到序列中n個元素向左遍歷的第乙個比它小的數的位置

1

const

int maxn = 100000 + 10;2

intn,a[maxn];

3int

l[maxn];45

void

solve()

615 }

例題largest rectangle in a histogram (poj no.2599)

柱狀圖是由一些寬度相等的長方形下端對齊後橫向排列得到的圖形。現有由n個寬度為1,高度分別為h1、h2...hn的長方形從左到右依次組成的長方形。問裡面包含的長方形的最大面積是多少。

例如:n = 7,h =

**實現

1 #include2 #include3 #include4

using

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...