單調佇列與單調棧總結

2021-07-23 09:27:48 字數 404 閱讀 4972

ref:

單調棧解決的是以某個值為最小(最大)值的最大區間,實現方法是:求最小值(最大值)的最大區間,維護乙個遞增(遞減)的棧,當遇到乙個比棧頂小的值的時候開始彈棧,彈棧停止的位置到這個值的區間即為此值左邊的最大區間;同時,當乙個值被彈掉的時候也就意味著比它更小(更大)的值來了,也可以計算被彈掉的值得右邊的最大區間。

單調佇列解決的是區間最小(最大)值,實現方法是:求區間最小(最大)值,就維護乙個遞增的雙端佇列,隊中儲存原始序列的標號,當即將入隊的元素的值比隊尾的元素的值小(大)的時候就不斷彈掉隊尾,知道出現比它更小的值,當即將入隊的元素隊首元素的跨度(即將入隊元素的序號到隊首元素序列的區間)大於規定區間時就不斷彈掉隊首,直到跨度小於或等於所規定的區間。如此可保證隊首元素為最小(最大)值,(但不能保證隊尾就是原始序列中的最大(最小)值),並維護區間長度。

單調佇列與單調棧

單調棧 單調棧,顧名思義,就是維持單調性 遞增或者遞減 的棧結構,如果新入棧的元素破壞了單調性,就彈出原先棧內元素,直到能夠滿足單調性 用途 它可以很方便地求出某個數的左邊或者右邊第乙個比它大或者小的元素,而且總時間複雜度o n 並且單調棧本身並不難實現 維護 每次入棧前先檢驗入棧後是否會破壞棧的單...

單調佇列與單調棧

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

單調佇列與單調棧

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