有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。
您只能在視窗中看到k個數字。
每次滑動視窗向右移動乙個位置。
以下是乙個例子:
該陣列為[1 3 -1 -3 5 3 6 7],k為3。
您的任務是確定滑動視窗位於每個位置時,視窗中的最大值和最小值。
輸入格式
輸入包含兩行。
第一行包含兩個整數n和k,分別代表陣列長度和滑動視窗的長度。
第二行有n個整數,代表陣列的具體數值。
同行資料之間用空格隔開。
輸入樣例:
8 31 3 -1 -3 5 3 6 7
輸出樣例:
-1 -3 -3 -3 3 3
3 3 5 5 6 7
2、基本思想:
用暴力作法,需要o(nk)的時間複雜度,為了優化降低時間複雜度,可以用單調佇列遍歷整個陣列,找最小值時將前面比新加入的數大的數都刪去,每次只取隊頭,可以將時間複雜度降低到o(n).
3、步驟:
①用乙個陣列來儲存輸入的數,用另乙個陣列儲存每個元素在原陣列中的下標。
②分為找最大值和找最小值兩步來寫。
#include
using
namespace std;
const
int n =
1000010
;int a[n]
, q[n]
;//a儲存原陣列,q儲存陣列元素下標
intmain()
cout << endl;
f =0, r =-1
;for
(int i =
0; i < n; i ++
)//最大值
return0;
}//該**引用acwing**的**
注意事項:
①q陣列儲存的是原陣列中的下標
②注意過程中一些變數的初始值為零,有的地方要加1
③注意什麼時候用隊頭,什麼時候用隊尾
AcWing 154 滑動視窗(模板)
給定乙個大小為n 10 6 n 106 n 106的陣列。有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。您只能在視窗中看到k個數字。每次滑動視窗向右移動乙個位置。以下是乙個例子 該陣列為 1 3 1 3 5 3 6 7 k為3。視窗位置 最小值最大值 1 3 1 3 5 3 6 7 13 ...
Acwing 154 滑動視窗 單調佇列
這題和poj2823是一樣的 解析 暴力,直接對於每k個都遍歷一遍,很顯然複雜度o nk 的話行不通。對於這類問題,有乙個比較一致的思路,就是有些數字是無用的,或者用了幾次後就要被扔掉的,後續根本就排不上用場。比如有ai,aj,ax,ax ai aj,找ax左邊第乙個比它小的數,很明顯,ai壓根不需...
Acwing 154 滑動視窗 單調佇列 經典模板
給定乙個大小為n 10 6 n 106 n 106的陣列。有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。您只能在視窗中看到k個數字。每次滑動視窗向右移動乙個位置。以下是乙個例子 該陣列為 1 3 1 3 5 3 6 7 k為3。視窗位置 最小值最大值 1 3 1 3 5 3 6 7 13 ...