Week5 滑動視窗 單調佇列

2021-10-04 10:13:22 字數 1422 閱讀 5915

題目內容

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

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

輸入格式

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

輸出格式

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

輸入樣例

8 3

1 3 -1 -3 5 3 6 7

輸出樣例

-1 -3 -3 -3 3 3

3 3 5 5 6 7

題目分析顯然,如果對每個區間暴力求解,一旦k大起來,那時間複雜度直接上天了都。

對於此題,我們可以維護乙個單調佇列,並且是採用的deque雙端佇列,這樣子我們就可以每一次只維護某個區間內的單調性了。

維護這個雙端佇列,把此佇列的左端點的位置看作是起點,那麼對於每次這個佇列(即視窗)移動的時候,右端維護單調性,左端把邊界以外的點丟出去,就能夠只掃瞄一遍就求出每個區間下的最小值了。

最大值同理。

#include

#include

#include

#include

using

namespace std;

int n, k;

struct point};

dequeminwindow;

dequemaxwindow;

vector<

int>minans;

vector<

int>maxans;

void

insert

(point p)

intmain()

for(

int i = k -

1; i < n; i++

)for

(int i =

0; i < minans.

size()

; i++

) cout << endl;

for(

int i =

0; i < maxans.

size()

; i++

)}

week5 作業D 滑動視窗

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

week5 D 滑動視窗 單調佇列

給定乙個陣列 大小為n 以及乙個視窗 大小為k 視窗在陣列上從開始到結尾移動,輸出每個位置的視窗裡的最大值和最小值。如圖 兩行數字,第一行兩個數字,分別為陣列的大小和視窗的大小,其中1 k n 1000000。輸出有兩行。第一行輸出滑動視窗在從左到右的每個位置時,滑動視窗中的最小值。第二行是最大值。...

Week5 D 滑動視窗(單調佇列)

問題描述 現有乙個長度為n的數列和乙個大小為k的視窗 1 k n 1000000 視窗可以在數列上來回移動。現在要求出在視窗從左往右滑的時候,每次視窗內數的最大值和最小值分別是多少。準備知識 單調佇列 單調 佇列 可執行操作 以單調遞增隊列為例 1.隊尾入隊 如果隊列為空或者隊尾元素小於入隊元素,則...