給乙個長度為n(<=1e6)的陣列,乙個長為k的滑動窗體從最左端移至最右端,你只能看到視窗中的k個數,每次窗體向右移動一位,如下圖:
你的任務是找出窗體在各個位置時的最大值和最小值。
第1行:兩個整數n和k;第2行:n個整數,表示陣列的n個元素(≤2e9);
第一行為滑動視窗從左向右移動到每個位置時的最小值,每個數之間用乙個空格分開;示例1第二行為滑動視窗從左向右移動到每個位置時的最大值,每個數之間用乙個空格分開。
8 31 3 -1 -3 5 3 6 7
-1 -3 -3 -3 3 3思路:區間性問題,首先要有乙個l和r指示區間左右兩邊。3 3 5 5 6 7
開乙個dq陣列,存元素的下標,再通過引用原陣列獲得值去比較,存下標的好處是可以指示出區間長度。
舉例取區間最小值的,每遍歷乙個a[i],把佇列中比它小的弄掉,讓當前這個更小的當頭,形成單調佇列,l始終指示區間範圍最小的,隊頭用r指示。詳看**。
#include#include#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define inf 0x3f3f3f3f //
/填充無限小-0x7f
intn,k;
int a[1000086
];int dq[1000086];///
用來儲存a[i]的下標,陣列a通過下標獲取值,區間範圍[ i-k,i ], i-k
<=l<=r<=i
intmain()
printf("\n
");l=r=0
; dq[r++]=1
;
for(int i=2;i<=n;i++)
printf("\n
");return0;
}
單調佇列 滑動視窗
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 肯定會超時,因此就想到把每次的最大值和...