6 滑動視窗 單調佇列

2022-09-16 14:33:10 字數 1256 閱讀 2274

暴力做法每次需要遍歷一下視窗內的每乙個數

時間複雜度o(n * k)

找性質

先看區間內的最小值

-3比3存活的時間更久,且-3比3小,所以-3是更優解,只要-3存在,3就不會是答案

tt 表示當前這個佇列儲存所用到位置

q[tt]儲存的是陣列中元素的下標

1 #include 2

using

namespace

std;

3const

int n = 1000010;4

inta[n], q[n];5//

a是原來的值,q是佇列6//

佇列裡面存的是下標

7int

main()

13int hh = 0, tt = -1;14

for (int i = 0; i < n; i++)

19while (hh <= tt && a[q[tt]] >=a[i])

22 q[++tt] =i;

23if (i >= k - 1

) 26

}27 cout <

28 hh = 0, tt = -1;29

for (int i = 0; i < n; i++)

33while (hh <= tt && a[q[tt]] <=a[i])

36 q[++tt] =i;

37if (i >= k - 1

) 40

}41 cout <

42return0;

43 }

單調佇列 滑動視窗

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...

單調佇列 滑動視窗

p1886 滑動視窗 模板 單調佇列 有乙個長為 n 的序列 a,以及乙個大小為 k 的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。如果按照暴力方法做的話,每一次判斷相鄰的k個數的最大值和最小值,複雜度為o n k 肯定會超時,因此就想到把每次的最大值和...