154 滑動視窗 單調佇列

2021-09-14 04:08:32 字數 1931 閱讀 6669

題目

給定乙個大小為

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

1 3 [-1 -3 5] 3 6 7-35

1 3 -1 [-3 5 3] 6 7-35

1 3 -1 -3 [5 3 6] 736

1 3 -1 -3 5 [3 6 7]37

您的任務是確定滑動視窗位於每個位置時,視窗中的最大值和最小值。

輸入格式

輸入包含兩行。

第一行包含兩個整數n和k,分別代表陣列長度和滑動視窗的長度。

第二行有n個整數,代表陣列的具體數值。

同行資料之間用空格隔開。

輸出格式

輸出包含兩個。

第一行輸出,從左至右,每個位置滑動視窗中的最小值。

第二行輸出,從左至右,每個位置滑動視窗中的最大值。

輸入樣例:

8 3

1 3 -1 -3 5 3 6 7

輸出樣例:

-1 -3 -3 -3 3 3

3 3 5 5 6 7

思路:

維護乙個單調佇列,

假如我們先求最小值,保證隊首就是最小值,滿足滑動視窗長度時輸出隊首;

例如樣例 1 3 -1 -3 5 3 6 7

第一步 1 先入隊了

第二步  1 小於3 沒問題 所以3接著入隊了

第三步   1和3 都大於-1 所以1和3都彈出  -1入隊  此時剛好滿足長度為k(k=3)的滑動視窗,輸出隊首 -1

第四步  -1 大於 -3 所以-1彈出 -3 入隊  輸出隊首-3

第五步 -3 小於5 沒問題  5入隊 輸出隊首-3

第六步  5大於3  那5不論怎麼樣都不可能是最小值了,所以彈出5  ,3入隊,輸出隊首-3

第六步  3小於6沒問題  6入隊,此時滑動視窗覆蓋範圍已經走到了(5,3,6) 所以要將-3 出隊,輸出隊首3

第七步 6小於7沒問題   ,7入隊,輸出隊首3

求最大值的話同理

#includeusing namespace std;

typedef long long ll;

#define readc(x) scanf("%c",&x)

#define read(x) scanf("%d",&x)

#define read2(x,y) scanf("%d%d",&x,&y)

#define read3(x,y,z) scanf("%d%d%d",&x,&y,&z)

#define print(x) printf("%d\n",x)

#define mst(a,b) memset(a,b,sizeof(a))

#define pb push_back

#define mp make_pair

const int maxn = 1e6 + 5;

int a[maxn];

struct node que[maxn];

int main()

int head = 1;

int tail = 0;

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

} printf("\n");

head = 1,tail = 0;

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

} printf("\n");

}

154 滑動視窗 單調佇列

給定乙個大小為n 106的陣列。有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。您只能在視窗中看到k個數字。每次滑動視窗向右移動乙個位置。以下是乙個例子 該陣列為 1 3 1 3 5 3 6 7 k為3。您的任務是確定滑動視窗位於每個位置時,視窗中的最大值和最小值。輸入格式 輸入包含兩行。第...

154 滑動視窗 單調佇列

給定乙個大小為n 10 6 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 ...

Acwing 154 滑動視窗 單調佇列

這題和poj2823是一樣的 解析 暴力,直接對於每k個都遍歷一遍,很顯然複雜度o nk 的話行不通。對於這類問題,有乙個比較一致的思路,就是有些數字是無用的,或者用了幾次後就要被扔掉的,後續根本就排不上用場。比如有ai,aj,ax,ax ai aj,找ax左邊第乙個比它小的數,很明顯,ai壓根不需...