第三次 2020.11.15
第四次(這次是用deque做噠!)
第五次
[點這裡到原題](
給定乙個大小為n≤106的陣列。
有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。
您只能在視窗中看到k個數字。
每次滑動視窗向右移動乙個位置。
以下是乙個例子:
該陣列為[1 3 -1 -3 5 3 6 7],k為3。
視窗位置 最小值 最大值
[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
您的任務是確定滑動視窗位於每個位置時,視窗中的最大值和最小值。
輸入格式
輸入包含兩行。
第一行包含兩個整數n和k,分別代表陣列長度和滑動視窗的長度。
第二行有n個整數,代表陣列的具體數值。
同行資料之間用空格隔開。
輸出格式
輸出包含兩個。
第一行輸出,從左至右,每個位置滑動視窗中的最小值。
第二行輸出,從左至右,每個位置滑動視窗中的最大值。
輸入樣例:
8 31 3 -1 -3 5 3 6 7
輸出樣例:
-1 -3 -3 -3 3 3
3 3 5 5 6 7
#include
using
namespace std;
int a[
1000010];
deque<
int>up;
deque<
int>down;
int minn[
1000010
],maxx[
1000010];
int n,k;
intmain()
if(!down.
size()
) down.
push_back
(i);
else
if(i>=k)
}for
(int i=
0;i<=n-k;i++
)printf
("%d "
,minn[i]);
printf
("\n");
for(
int i=
0;i<=n-k;i++
)printf
("%d "
,maxx[i]);
return0;
}
題目
#include
using
namespace std;
const
int n =
1000010
;int a[n]
, q[n]
;int hh =
0, tt =-1
;void
out(
)int
main()
q[++ tt]
= i;
printf
("當前佇列\n");
for(
int i = hh; i <= tt; i ++
)printf
("%d "
, a[q[i]])
;puts(""
);puts(""
);if(i >= k -1)
printf
("________%d \n\n\n"
, a[q[hh]])
;}puts(""
);return0;
}
#include
using
namespace std;
const
int n =
1000010
;int a[n]
, q[n]
;int
main()
puts(""
);//這裡處理的是最大值
hh =
0, tt =-1
;for
(int i =
0; i < n; i ++
)puts(""
);return0;
}
第三次刷題位址
傳送到題目
思路
經典的單調佇列問題,三刷了……
簡單地說就死維護乙個單調佇列,每次輸出隊尾即可。
#include
using
namespace std;
const
int n =
1000010
;int a[n]
, q[n]
;int
main()
puts(""
);//這裡處理的是最大值
hh =
0, tt =-1
;for
(int i =
0; i < n; i ++
)puts(""
);return0;
}
第四刷的部落格鏈結
四刷了哦,滑動視窗這道題……
以下是四種定義deque的方法
// 直接定義
std:
:deque<
int> first;
// empty deque of ints
//填充數字
std:
:deque<
int> second (4,
100)
;// four ints with value 100
//the contents of second are: 100 100 100 100
//複製某雙端佇列的某一段
std:
:deque<
int> third (second.
begin()
,second.
end())
;// iterating through second
//the contents of third are: 100 100 100 100
//或者直接複製下整個其它雙端佇列
std:
:deque<
int> fourth (third)
;// a copy of third
//the contents of fourth are: 100 100 100 100
//或者複製某個陣列
// the iterator constructor can be used to copy arrays:
int myints=
; std:
:deque<
int> fifth (myints, myints +
sizeof
(myints)
/sizeof
(int))
;//the contents of fifth are: 16 2 77 29
#include
using
namespace std;
const
int n =
1e6+10;
int a[n]
;//不要給雙端佇列q定義大小,我也不清楚
deque<
int>q;
intmain()
puts(""
);//遞減
q.clear()
;for
(int i =
1; i <= n; i ++
)puts(""
);return0;
}
這次是在周測10做的,只用到單調遞減佇列。
題目 : 掃瞄
#include
using
namespace std;
const
int n =
3e6+10;
deque<
int>q;
int a[n]
;int
main()
return0;
}
滑動窗空 單調佇列
給定乙個大小為n 106的陣列。有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。您只能在視窗中看到k個數字。每次滑動視窗向右移動乙個位置。以下是乙個例子 該陣列為 1 3 1 3 5 3 6 7 k為3。您的任務是確定滑動視窗位於每個位置時,視窗中的最大值和最小值。輸入格式 輸入包含兩行。第...
單調佇列 滑動視窗
nkoj 2152 description 給你乙個長度為n n 10 6 的陣列,乙個長為k的滑動的窗體從最左移至最右端,你只能見到視窗的k個數,每次窗體向右移動一位,找出窗體所包含的數字的最大和最小值,如下表所示 k的值為3 視窗位置 最小值 最大值 1 3 1 3 5 3 6 7 1 3 1 ...
滑動視窗 單調佇列
給定乙個大小為n 106的陣列。有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。您只能在視窗中看到k個數字。每次滑動視窗向右移動乙個位置。以下是乙個例子 該陣列為 1 3 1 3 5 3 6 7 k為3。視窗位置 最小值 最大值 1 3 1 3 5 3 6 7 1 3 1 3 1 3 5 3...