單調佇列 滑動視窗 掃瞄(低配滑動視窗)

2022-04-29 03:27:07 字數 4266 閱讀 8740

第三次 2020.11.15

第四次(這次是用deque做噠!)

第五次

[點這裡到原題](

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

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

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

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

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

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

輸入格式

輸入包含兩行。

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

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

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

輸出格式

輸出包含兩個。

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

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

輸入樣例:

8 31 3 -1 -3 5 3 6 7

輸出樣例:

-1 -3 -3 -3 3 3

3 3 5 5 6 7

#include

using

namespace std;

int a[

1000010];

deque<

int>up;

deque<

int>down;

int minn[

1000010

],maxx[

1000010];

int n,k;

intmain()

if(!down.

size()

) down.

push_back

(i);

else

if(i>=k)

}for

(int i=

0;i<=n-k;i++

)printf

("%d "

,minn[i]);

printf

("\n");

for(

int i=

0;i<=n-k;i++

)printf

("%d "

,maxx[i]);

return0;

}

題目

#include

using

namespace std;

const

int n =

1000010

;int a[n]

, q[n]

;int hh =

0, tt =-1

;void

out(

)int

main()

q[++ tt]

= i;

printf

("當前佇列\n");

for(

int i = hh; i <= tt; i ++

)printf

("%d "

, a[q[i]])

;puts(""

);puts(""

);if(i >= k -1)

printf

("________%d \n\n\n"

, a[q[hh]])

;}puts(""

);return0;

}

#include

using

namespace std;

const

int n =

1000010

;int a[n]

, q[n]

;int

main()

puts(""

);//這裡處理的是最大值

hh =

0, tt =-1

;for

(int i =

0; i < n; i ++

)puts(""

);return0;

}

第三次刷題位址

傳送到題目

思路

經典的單調佇列問題,三刷了……

簡單地說就死維護乙個單調佇列,每次輸出隊尾即可。

#include

using

namespace std;

const

int n =

1000010

;int a[n]

, q[n]

;int

main()

puts(""

);//這裡處理的是最大值

hh =

0, tt =-1

;for

(int i =

0; i < n; i ++

)puts(""

);return0;

}

第四刷的部落格鏈結

四刷了哦,滑動視窗這道題……

以下是四種定義deque的方法

// 直接定義

std:

:deque<

int> first;

// empty deque of ints

//填充數字

std:

:deque<

int> second (4,

100)

;// four ints with value 100

//the contents of second are: 100 100 100 100

//複製某雙端佇列的某一段

std:

:deque<

int> third (second.

begin()

,second.

end())

;// iterating through second

//the contents of third are: 100 100 100 100

//或者直接複製下整個其它雙端佇列

std:

:deque<

int> fourth (third)

;// a copy of third

//the contents of fourth are: 100 100 100 100

//或者複製某個陣列

// the iterator constructor can be used to copy arrays:

int myints=

; std:

:deque<

int> fifth (myints, myints +

sizeof

(myints)

/sizeof

(int))

;//the contents of fifth are: 16 2 77 29

#include

using

namespace std;

const

int n =

1e6+10;

int a[n]

;//不要給雙端佇列q定義大小,我也不清楚

deque<

int>q;

intmain()

puts(""

);//遞減

q.clear()

;for

(int i =

1; i <= n; i ++

)puts(""

);return0;

}

這次是在周測10做的,只用到單調遞減佇列。

題目 : 掃瞄

#include

using

namespace std;

const

int n =

3e6+10;

deque<

int>q;

int a[n]

;int

main()

return0;

}

滑動窗空 單調佇列

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

單調佇列 滑動視窗

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