單調棧
棧中的元素從棧底到棧頂單調
模板
例題:單調棧常見模型:找出每個數左邊離它最近的比它大/小的數
int tt =0;
for(
int i =
1; i <= n; i ++
)
給定乙個長度為n的整數數列,輸出每個數左邊第乙個比它小的數,如果不存在則輸出-1。
輸入格式
第一行包含整數n,表示數列長度。
第二行包含n個整數,表示整數數列。
輸出格式
共一行,包含n個整數,其中第i個數表示第i個數的左邊第乙個比它小的數,如果不存在則輸出-1。
資料範圍
1≤n≤105
1≤數列中元素≤109
輸入樣例:
53 4 2 7 5
輸出樣例:
-1 3 -1 2 2
**思路#include
using
namespace std;
const
int n =
100010
;int n;
int stk[n]
, tt =0;
intmain()
return0;
}
利用棧後進先出的特點,讓某個數進棧前先把在他之前進棧的(即左邊離他最近的數)不符合要求的數出棧,此時棧中就維護了乙個單調序列
單調佇列
佇列中的元素單調
模板
例題:視窗滑動常見模型:找出滑動視窗中的最大值/最小值
int hh =
0, tt =-1
;for
(int i =
0; i < n; i ++
)原理:利用乙個迴圈控制隊頭,利用乙個迴圈控制隊尾,隊頭決定隊的長度,隊尾控制佇列中的序列單調
給定乙個大小為n≤106的陣列。
有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。
您只能在視窗中看到k個數字。
每次滑動視窗向右移動乙個位置。
以下是乙個例子:
該陣列為[1 3 -1 -3 5 3 6 7],k為3。
您的任務是確定滑動視窗位於每個位置時,視窗中的最大值和最小值。
輸入格式
輸入包含兩行。
第一行包含兩個整數n和k,分別代表陣列長度和滑動視窗的長度。
第二行有n個整數,代表陣列的具體數值。
同行資料之間用空格隔開。
輸出格式
輸出包含兩個。
第一行輸出,從左至右,每個位置滑動視窗中的最小值。
第二行輸出,從左至右,每個位置滑動視窗中的最大值。
輸入樣例:
8 31 3 -1 -3 5 3 6 7
輸出樣例:
-1 -3 -3 -3 3 3
3 3 5 5 6 7
#include
using
namespace std;
const
int n =
1000010
;int n, k;
int a[n]
, q[n]
;int
main()
puts(""
);hh =
0, tt =-1
;for
(int i =
0; i < n; i++
)puts(""
);return0;
}
資料結構 單調棧與單調佇列
830.單調棧 154.滑動視窗 79.滑動視窗的最大值 單調棧的應用場景 求最近的最值 單調佇列的應用場景 求滑動視窗內的最值 單調佇列步驟 值得注意的是單調佇列存的是下標,方便判斷隊頭是否滑出視窗 1.判斷隊頭是否滑出視窗 2.判斷完之後那麼隊頭就是滑動視窗的最值,處理題目邏輯 順序不一定在2,...
資料結構 單調棧與單調佇列
單調棧是棧內元素具有嚴格單調性的一種資料結構。由於我們要找到每個數左邊第乙個比它小的數,那麼我們便可以發現 對於棧中任意乙個數,如果在它右邊存在乙個數比它小 或相等 那麼這個數便是不可能被選中的,直接彈出棧即可。於是我們便可以進行如下操作 按序列舉每乙個數,準備將當前這個數壓棧時,從棧頂開始遍歷,如...
模板 資料結構 單調佇列 單調棧
一道例題,給定一串數字,求每連續k個數字的最大 最小值。思路 初始化乙個初始長度為k的單調佇列,按從左到右加入元素,同時滿足這個佇列中的元素是遞減的 也就是假如某個數被兩個距離不超過k的大於他的數夾著,他會被從隊尾調出佇列 得到最大值。向右移動一格,假如隊首離開範圍,出隊。往隊尾加入元素前,把隊尾的...