WEEK 5 D 滑動視窗

2021-10-04 04:55:45 字數 984 閱讀 5662

zjm 有乙個長度為 n 的數列和乙個大小為 k 的視窗, 視窗可以在數列上來回移動. 現在 zjm 想知道在視窗從左往右滑的時候,每次視窗內數的最大值和最小值分別是多少. 例如:

輸入有兩行。第一行兩個整數n和k分別表示數列的長度和滑動視窗的大小,1<=k<=n<=1000000。第二行有n個整數表示zjm的數列。

輸出有兩行。第一行輸出滑動視窗在從左到右的每個位置時,滑動視窗中的最小值。第二行是最大值。

8 31 3 -1 -3 5 3 6 7

1 -3 -3 -3 3 3

3 3 5 5 6 7

這裡是要求取大小為k的滑動視窗內的最值,對於i來說,要求的是區間[i-k+1,i]的最大值與最小值,因此,對於不屬於當前範圍的元素應去除,即隊首元素,所以在這裡使用佇列結構較為適合。

建立乙個單調遞增的佇列,依次壓入各個數字,若要壓入的數不滿足佇列的單調性,則從隊尾元素開始移除,直到要壓入的元素壓入後不影響單調性。壓入之後,應考察隊首元素是否屬於當前範圍,若不屬於當前範圍,則將其移除。在處理後的佇列中,隊首元素即為以壓入元素為右邊界的滑動視窗內的最小元素,直到壓入最後乙個數,此時便可求出所有視窗的最小值。

同理建立乙個單調遞減佇列,即可求出每個視窗位置的最大值。

#include

using

namespace std;

const

int n =

1e7+10;

int min0[n]

, max0[n]

, q[n]

,a[n]

;int n, k;

void

solvemin()

}void

solvemax()

}int

main()

return0;

}

Week5 D 滑動視窗

問題描述 zjm 有乙個長度為 n 的數列和乙個大小為 k 的視窗,視窗可以在數列上來回移動.現在 zjm 想知道在視窗從左往右滑的時候,每次視窗內數的最大值和最小值分別是多少.例如 數列是 1 3 1 3 5 3 6 7 其中 k 等於 3.解題思路 區域性最大最小可利用單調佇列,以單調遞增隊列為...

Week5 D 滑動視窗滑動視窗

week5 d 滑動視窗滑動視窗 zjm 有乙個長度為 n 的數列和乙個大小為 k 的視窗,視窗可以在數列上來回移動.現在 zjm 想知道在視窗從左往右滑的時候,每次視窗內數的最大值和最小值分別是多少.例如 數列是 1 3 1 3 5 3 6 7 其中 k 等於 3.window position ...

week5 D 滑動視窗滑動視窗

zjm 有乙個長度為 n 的數列和乙個大小為 k 的視窗,視窗可以在數列上來回移動.現在 zjm 想知道在視窗從左往右滑的時候,每次視窗內數的最大值和最小值分別是多少.例如 數列是 1 3 1 3 5 3 6 7 其中 k 等於 3.window position minimum value max...