滑動視窗 單調佇列入門 (白書P241)

2021-07-05 01:39:35 字數 638 閱讀 8308

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