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.解題思路 區域性最大最小可利用單調佇列,以單調遞增隊列為...