演算法總結 單調棧或佇列

2022-06-12 15:21:11 字數 1373 閱讀 8426

單調棧,就是乙個棧,裡面的元素滿足一定的單調性。(多見於單調增/單調減)

1)新元素加入棧前,會在棧頂端把破壞棧單調性的元素都刪除,直到棧為空或者棧滿足單調性才能加入新元素。

2)單調棧是 o(n) 級的時間複雜度,所有元素只會進入棧一次,並且出棧後再也不會進棧。

3)單調棧可以找到元素向左遍歷第乙個比他小(大)的元素,也就是說在元素進棧前他向左拓展的區間已經確定,在出棧前她能向右拓展的區間也能確定(左區間好理解,仔細體會右區間的確定,若該元素至遍歷結束後也未出棧,那麼就是說在原陣列中,該元素的右方向沒有乙個元素可以比它大/小,那麼該元素的右邊界就是原陣列的大小(就是沒有右邊界),否則它的右邊界就是令它出棧的元素)。

例1題目描述:

給定乙個陣列,返回乙個大小相同的陣列。返回的陣列的第i個位置的值應當是,對於原陣列中的第i個元素,至少往右走多少步,才能遇到乙個比自己大的元素(如果之後沒有比自己大的元素,或者已經是最後乙個元素,則在返回陣列的對應位置放上-1)

example:

input

5,3,1,2,4

output

-1 3 1 1 -1

solution

#include #include 

#include

using

namespace

std;

vector

steptogreater(vector &nums);

nums.push_back(int_min);

vector

res(n, -1

); stack

s;for (int i = 0; i <=n; )

}nums.pop_back();

return

res;

}int

main();

vector

res =steptogreater(v);

for(auto n : res)

cout

"pause");

return0;

}

例2:【leetcode】084. largest rectangle in histogram

通常來講,單調棧更傾向於一維陣列的問題,或者是多維陣列可以轉化為一維陣列的問題。多儲存元素座標而非元素值。問題多見於尋找陣列元素左區間或右區間最大最小問題,或者找出元素的兩邊界問題。

單調佇列其實和單調棧差不多,乙個思想:棧或佇列中元素滿足單調性,當有新元素要入棧或者入隊的時候,要和棧頂或者隊尾元素進行比較,滿足單調的性質則入隊或入棧,否則將棧頂或隊尾元素刪去,直到滿足單調性質,然後將新元素入隊或入棧。

例題:【佇列】滑動視窗的最大值,類似的還有求最小值問題。

單調棧 佇列總結

51nod 1102 面積最大的矩形 有乙個正整數的陣列,化為直方圖,求此直方圖包含的最大矩形面積。法一 以每個柱子為高,預處理出每個點能夠向兩邊延伸的距離,左找到第乙個比當前點高度小的下標記為i,向右找到第乙個比當前點高度小的下標記為j,那麼此時以這點高度的最大值是f i j i 1 然後用for...

單調佇列與單調棧總結

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

棧和佇列 單調佇列 單調棧

講解部落格鏈結 一 單調棧 1 什麼是單調棧?單調棧是指乙個棧內部元素具有嚴格單調性 單調遞增,單調遞減 的一種資料結構。2 單調棧的兩個性質 滿足從棧頂到棧底具有嚴格的單調性 滿足後進先出的特徵,越靠近棧底的元素越早的進棧。3 元素進棧的過程 對於當前進棧元素x 如果x 棧頂元素,x 進棧。否則 ...