資料結構 單調棧和單調佇列(C 版)

2021-10-08 10:48:38 字數 2028 閱讀 2429

單調棧

棧中的元素從棧底到棧頂單調

模板

常見模型:找出每個數左邊離它最近的比它大/小的數

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的大於他的數夾著,他會被從隊尾調出佇列 得到最大值。向右移動一格,假如隊首離開範圍,出隊。往隊尾加入元素前,把隊尾的...