week5 作業D 滑動視窗

2021-10-04 04:30:51 字數 1435 閱讀 3216

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

數列是 [1 3 -1 -3 5 3 6 7], 其中 k 等於 3.

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

output

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

smple input

8 3

1 3 -1 -3 5 3 6 7

sample output

-1 -3 -3 -3 3 3

3 3 5 5 6 7

我的思路:這道題需要運用到單調佇列的方法。因為我們要得到滑動視窗的實時最大、最小值,我們可以利用單調佇列的特點,維護乙個單調區間,且左端和右端均可以改變,對於序列進行兩次單調佇列處理,一次左端最小,一次左端最大,兩種方法類似。左端最小的情況,對於當前的數,如果當前佇列尾部的數大於這個數,則有指標向左移動,知道滿足佇列尾部數小於當前數;然後,從左指標開始找,如果左指標所指的數,已經不再當前的滑動視窗中了,則左指標向右移,知道其所指的數在滑動視窗的區間內。這個時候這個左指標所指向的數即為當前滑動視窗的最小值。左端最大的情況,則類似,每次插入數要比佇列尾部小。最後,還是最左端就是當前滑動視窗的最大值。

我的總結:

單調佇列在解決對於連續,且需要兩端都操作的問題上,是乙個很好的方法。

我的**:

#include

#include

using

namespace std;

int n,k,num[

1000000];

int q[

1000000

],head,tail;

void

dqu_min()

printf

("\n");

}void

dqu_max()

printf

("\n");

}int

main()

滑動視窗 Week5作業D題

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

Week5 滑動視窗 單調佇列

題目內容 有乙個長度為 n 的數列和乙個大小為 k 的視窗,視窗可以在數列上來回移動.現在想知道在視窗從左往右滑的時候,每次視窗內數的最大值和最小值分別是多少.例如 數列是 1 3 1 3 5 3 6 7 其中 k 等於 3.輸入格式 輸入有兩行。第一行兩個整數n和k分別表示數列的長度和滑動視窗的大...

Week5 D 滑動視窗滑動視窗

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