#include #include using namespace std;
#define max 1000001
int a[max]; //儲存資料
int q[max]; //佇列
int p[max]; //儲存a[i]中的下標i
int min[max]; //輸出最小
int max[max]; //輸出最大
int n,k;
void get_min()
for(; i=a[i])
--tail;
q[++tail]=a[i];
p[tail]=i;
while(p[head]min[i-k+1]=q[head];
}}void get_max()
for(; imax[i-k+1]=q[head];
}}void output()
printf("\n");
//輸出最大值
for(i=0; iprintf("\n");
}int main()
get_min();
get_max();
output();
return 0;
}
滑動視窗 單調佇列入門題
給定乙個大小為n 106n 106的陣列。有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。您只能在視窗中看到k個數字。每次滑動視窗向右移動乙個位置。以下是乙個例子 該陣列為 1 3 1 3 5 3 6 7 k為3。視窗位置 最小值最大值 1 3 1 3 5 3 6 7 13 1 3 1 3 ...
滑動視窗 單調佇列入門題
給定乙個大小為n 106n 106的陣列。有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。您只能在視窗中看到k個數字。每次滑動視窗向右移動乙個位置。以下是乙個例子 該陣列為 1 3 1 3 5 3 6 7 k為3。視窗位置 最小值最大值 1 3 1 3 5 3 6 7 13 1 3 1 3 ...
C 單調佇列入門應用 例題詳解 滑動視窗
滑動視窗 關於這道題,首先會想到暴搜,但資料太大,絕對超時。用暴搜的思路來說,就是乙個乙個列舉,再在當中找出最大最小值,會發現,每次都在重複列舉,那有沒有什麼方法可以儲存之前的值?這就引出主題了 單調佇列 單調佇列,就是乙個佇列,但有單調性,就是佇列裡的元素是遞增或遞減的 例如 1 2 3 4 5 ...