Week5 D 滑動視窗滑動視窗

2021-10-04 11:09:31 字數 1818 閱讀 9137

week5 d - 滑動視窗滑動視窗

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

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

window position minimum value maximum value

[1 3 -1] -3 5 3 6 7 -1 3

1 [3 -1 -3] 5 3 6 7 -3 3

1 3 [-1 -3 5] 3 6 7 -3 5

1 3 -1 [-3 5 3] 6 7 -3 5

1 3 -1 -3 [5 3 6] 7 3 6

1 3 -1 -3 5 [3 6 7] 3 7

input

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

output

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

sample input

831

3-1-

3536

7

sample output

-1-

3-3-

3333

3556

7

解題思路

利用滑動視窗(如題)

滑動視窗內利用單調棧來找出最大和最小值

本題難度

(1)用 deque 會超時 建議自行構造佇列

遍歷時只使用兩次 for 也能降低 tl 的機率

或是取消 cin 同步 加個輸入優化也行

(2)我太菜了

code

#include

#include

#include

#include

#include

#include

using

namespace std;

int n,k;

int s[

1000100]=

;int

main()

deque int,

int>

> st;

//value nums

for(i=

0;i) st.push_back (pair<

int,

int>

(s[i]

,i));if

(i>=k-1)

cout

.first;

if(i+

1!=n)cout<<

' ';

else cout

clear()

;for

(i=0

;i) st.push_back (pair<

int,

int>

(s[i]

,i));if

(i>=k-1)

cout

.first;

if(i+

1!=n)cout<<

' ';

else cout

}

week5 D 滑動視窗滑動視窗

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

WEEK 5 D 滑動視窗

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

Week5 D 滑動視窗

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