單調棧、單調佇列是在棧和佇列的基礎上加上單調結構的資料結構。如果乙個元素入棧或入隊,他會檢查之前的元素,如果之前的元素不可能是答案的解,那麼就彈出元素,使得當前元素入棧或入隊。
leetcode 239 滑動視窗最大值
此題是單調佇列,每次遇到乙個元素,一直從隊尾彈出,直到隊尾元素大於該元素為止。還需要注意檢查隊頭元素是否在區間內。
leetcode 84 柱狀圖中最大的矩形
此題為單調棧,首先的思路是先計算每乙個柱子能到達的左邊的最遠距離和右邊的最遠距離,然後在遍歷一次陣列即可。我們分兩次計算,設定乙個單調棧,從左向右遍歷陣列,如果碰見小於棧頂元素,那就彈出棧頂,當棧中的元素被某乙個元素彈出的時候,就是最遠距離。計算最右邊界也是如此,處理邊界的時候,我們可以設定哨兵節點,使最後的時候棧能保持空的狀態。
cfg 102916g
長度為k的最小子序列,利用單調棧可以輕鬆實現,當棧頂元素能夠被彈出的時候,需要滿足一下條件:
剩餘字串行的長度能夠滿足所需要的k的長度
棧頂元素大於要插入的元素
int
main()
if(sta.
size()
< k)
sta.
push
(s[i]);
} string ans;
while
(!sta.
empty()
)reverse
(ans.
begin()
, ans.
end())
;return ans;
return0;
}
leetcode 5893
此題除了要求長度為k,還要求至少包含m個目標字元,也可以使用單調棧,只不過多加乙個剩餘字串行的包含的目標字元能滿足m個目標字元即可,以及何時才能加入字元。
class
solution
stack<
char
> sta;
int req =0;
for(
int i =
0; i < s.
size()
; i++)if
(sta.
size()
< k && repetition -
(req +
(s[i]
== letter)
)<= k -
int(sta.
size()
)-1)
} string ans;
while
(!sta.
empty()
)reverse
(ans.
begin()
,ans.
end())
;return ans;}}
;
// todo list
lc739. daily temperatures
lc862. shortest subarray with sum at least k
lc901. online stock span
lc907. sum of subarray minimums
單調棧,單調佇列
大多數借鑑了 單調佇列是什麼呢?可以直接從問題開始來展開。poj 2823 給定乙個數列,從左至右輸出每個長度為m的數列段內的最小數和最大數。數列長度 n 106,m n 我們知道,解法 在暴力列舉的過程中,有乙個地方是重複比較了,就是在找當前的f i 的時候,i的前面其它m 1個數在算f i 1 ...
單調棧 單調佇列
啊學完了來寫個總結吧 顧名思義,單調,就是指色彩單一某乙個容器裡面的元素都是遞增或遞減的,而單調棧和單調佇列就是這個容器。單調棧 單調棧模板 其他的我就不說了,講下為什麼單調棧是從後往前掃瞄 當我們在判斷乙個數後面第乙個比它大的數時,前提是後面的數已經被處理了,所以我們要從後往前掃瞄。我做了兩種做法...
單調棧 單調佇列
最近打了三場比賽瘋狂碰到單調棧和單調佇列的題目,第一,二兩場每場各乙個單調棧,第三場就碰到單調佇列了。於是乎就查各種部落格,找單調棧,單調佇列的模板題去做,搞著搞著發現其實這兩個其實是一回事,只不過利用了容器內元素單調的不同特性,用來加速處理不同的問題。單調棧解決的是以某個值為最小 最大 值的最大區...