單調佇列與單調棧

2021-07-03 19:46:39 字數 1514 閱讀 7924

單調棧

單調棧,顧名思義,就是維持單調性(遞增或者遞減)的棧結構,如果新入棧的元素破壞了單調性,就彈出原先棧內元素,直到能夠滿足單調性

用途:它可以很方便地求出某個數的左邊或者右邊第乙個比它大或者小的元素,而且總時間複雜度o(n),並且單調棧本身並不難實現

維護:每次入棧前先檢驗入棧後是否會破壞棧的單調性,如果不會,就直接入棧,否則使原棧棧頂元素出棧,直到棧空或者滿足要求

操作樣例:6 10 3 7 4 12 2 遞增

初始狀態:空棧

6 入棧:空棧 -> 6

10入棧:6 -> 6,10

3 入棧:6,10 -> 6 -> 空棧 -> 3

7 入棧:3 -> 3,7

4 入棧:3,7 -> 3 -> 3,4

12入棧:3,4 -> 3,4,12

2 入棧:3,4,12 -> 3,4 -> 3 -> 空棧 ->2

**:

for(j=0;j"%d",&m);

while(len&&m>=s[len-1])--len;

s[len++]=m;

}

相關題目傳送門:

poj 3250:

單調佇列

與單調棧相似,單調佇列就是維持單調性的佇列,加入新元素時同樣需要維持其單調性,其方式也類似

用途:對於維護好的單調佇列,對內元素是有序的,那麼取出最大值(最小值)的複雜度是o(1)

維護:與單調棧的方式相似,但是不僅可以從隊尾出棧(用於維持其單調性),也可以從隊首出棧(其他限制條件),因此其實現比單調棧複雜一些

操作樣例1:1 3 -1 -3 5 3 6 7 求每連續三個數的最大值和最小值

初始狀態:1,3

-1入棧:-1,1,3 獲取最大值3,最小值-1(先出棧,後入棧)

1出隊-3入隊:-1,1,3 -> -1,3->-3,-1,3 獲取最大值3,最小值-3

3出隊5入隊:-3,-1,3 -> -3,-1 ->-3,-1,5 獲取最大值5,最小值-3

-1出隊3入隊:-3,-1,5 -> -3,5 -> -3,3,5 獲取最大值5,最小值-3

-3出隊6入隊:-3,3,5 -> 3,5 ->3,5,6 獲取最大值6,最小值3

5出隊7入隊:3,5,6 -> 3,6 -> 3,6,7 獲取最大值7,最小值5

操作樣例2:1 3 -1 -3 5 3 6 7 求每連續三個數的最大值

初始狀態:1 -> 空 -> 3

-1入棧:3 -> 3,-1獲取最大值3(先出隊,後入隊)

1出隊-3入隊:3,-1 ->3,-1,-3 獲取最大值3

3出隊5入隊:3,-1,-3 -> 空 -> 5 獲取最大值5

-1出隊3入隊:5 -> 5,3 獲取最大值5

-3出隊6入隊:5 -> 空 -> 6 獲取最大值6

5出隊7入隊:6 -> 空 -> 7 獲取最大值7

實際**有點複雜,詳見相關題目題解,傳送門

單調佇列與單調棧

線段樹等等容易tle,我們需要乙個o n 的演算法來解決這個問題。思路 可以看出,這個視窗是可以用乙個雙向佇列來模擬的,每當後方加入乙個數,都要從佇列尾部開始淘汰掉所有的小於它的數,保證佇列中每乙個數的後面,在視窗範圍內沒有大於等於它的數。當隊首元素不在視窗範圍時,隊首元素出隊。這樣操作後,隊內的元...

單調佇列與單調棧

線段樹等等容易tle,我們需要乙個o n 的演算法來解決這個問題。思路 可以看出,這個視窗是可以用乙個雙向佇列來模擬的,每當後方加入乙個數,都要從佇列尾部開始淘汰掉所有的小於它的數,保證佇列中每乙個數的後面,在視窗範圍內沒有大於等於它的數。當隊首元素不在視窗範圍時,隊首元素出隊。這樣操作後,隊內的元...

單調棧與單調佇列

單調棧 單調棧就是棧內元素保持單調性的棧 遍歷整個序列,每一次從棧頂彈出會破壞單調性的元素,最後將當前元素加入棧頂 由於每個元素最多入棧一次,出棧一次,所以可以在 o n 的時間複雜度內處理資料 相關題目 hdu1506 largest rectangle in a histogram includ...