AcWing 154 滑動視窗(C 演算法)

2021-10-08 09:58:23 字數 1079 閱讀 4175

有乙個大小為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 ...