單調棧,就是乙個棧,裡面的元素滿足一定的單調性。(多見於單調增/單調減)
1)新元素加入棧前,會在棧頂端把破壞棧單調性的元素都刪除,直到棧為空或者棧滿足單調性才能加入新元素。
2)單調棧是 o(n) 級的時間複雜度,所有元素只會進入棧一次,並且出棧後再也不會進棧。
3)單調棧可以找到元素向左遍歷第乙個比他小(大)的元素,也就是說在元素進棧前他向左拓展的區間已經確定,在出棧前她能向右拓展的區間也能確定(左區間好理解,仔細體會右區間的確定,若該元素至遍歷結束後也未出棧,那麼就是說在原陣列中,該元素的右方向沒有乙個元素可以比它大/小,那麼該元素的右邊界就是原陣列的大小(就是沒有右邊界),否則它的右邊界就是令它出棧的元素)。
例1題目描述:
給定乙個陣列,返回乙個大小相同的陣列。返回的陣列的第i個位置的值應當是,對於原陣列中的第i個元素,至少往右走多少步,才能遇到乙個比自己大的元素(如果之後沒有比自己大的元素,或者已經是最後乙個元素,則在返回陣列的對應位置放上-1)
example:
input5,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 進棧。否則 ...