滑動視窗 單調佇列入門題

2022-05-07 14:45:11 字數 1440 閱讀 9964

給定乙個大小為n≤106<?xml:namespace prefix = "[default] " ns = "" />n≤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] 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

單調就時指在佇列中要每組從小到大的公升序,或者從大到小的降序。。
這題也就是單調佇列的應用。
思路:
建立大小為k的單調佇列,然後每次入隊乙個,檢查其是否大於佇列前面的數,如果小於前面的數,
則讓,前面大於它的數出隊。然後將其加入。這樣就保證當前方框的最小值,保持在隊首。
同理,求最大值,就保證是降序。
**:

#include #include #include using

namespace std;

const

int n = 1e6 + 5;

int n, k;

int q[n], a[n], head, tail;

int main()

cout << endl;

head = 0;

tail = -1;

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

}

滑動視窗 單調佇列入門題

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

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

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