zjm 有乙個長度為 n 的數列和乙個大小為 k 的視窗, 視窗可以在數列上來回移動. 現在 zjm 想知道在視窗從左往右滑的時候,每次視窗內數的最大值和最小值分別是多少. 例如:數列是 [1 3 -1 -3 5 3 6 7], 其中 k 等於 3.
輸入有兩行。第一行兩個整數n和k分別表示數列的長度和滑動視窗的大小,1<=k<=n<=1000000。第二行有n個整數表示zjm的數列。output輸出有兩行。第一行輸出滑動視窗在從左到右的每個位置時,滑動視窗中的最小值。第二行是最大值。smple input8 3sample output1 3 -1 -3 5 3 6 7
-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 ...