題目內容
有乙個長度為 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題目分析顯然,如果對每個區間暴力求解,一旦k大起來,那時間複雜度直接上天了都。3 3 5 5 6 7
對於此題,我們可以維護乙個單調佇列,並且是採用的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.隊尾入隊 如果隊列為空或者隊尾元素小於入隊元素,則...