學弟講演算法 數論 滑動視窗最值

2021-10-24 07:24:41 字數 2145 閱讀 5136

給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位

輸入: nums = [1,3,-1,-3,5,3,6,7], k = 3

輸出: [3,3,5,5,6,7]

滑動視窗的位置

最大值[1 3 -1]-3 5 3 6 7

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

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

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

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

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

此處使用雙向佇列(deque)這個資料結構

當前滑動視窗的最大值總是儲存在隊頭,佇列裡資料從大到小排列

若遇到的值比隊尾元素大,則將從隊尾開始比該值小的元素出隊,再將新值插入隊尾中

若遇到的值比當隊尾元素小,則直接插入到隊尾

每次移動的時,判斷隊頭元素(視窗最大值)是否在有效範圍.若不在,將其從佇列中刪除

num = [1,3,-1,-3,5,3,6,7] ,k = 3

原始陣列

佇列res

13 -1 -3 5 3 6 7

113-1 -3 5 3 6 7

31 3-1-3 5 3 6 7

3,-1

31 3 -1-35 3 6 7

3,-1,-3

3,31 3 -1 -353 6 7

53,3,5

1 3 -1 -3 536 7

5,33,3,5,5

1 3 -1 -3 5 367

63,3,5,5,6

1 3 -1 -3 5 3 677

3,3,5,5,6 ,7

原始陣列

佇列res

23 4 2 6 2 5 1

2234 2 6 2 5 1

32 342 6 2 5 144

2 3 426 2 5 1

4,24,4

2 3 4 262 5 1

64,4,6

2 3 4 2 625 1

6,24,4,6,6

2 3 4 2 6 251

6,54,4,6,6,6

2 3 4 2 6 2 515,14,4,6,6,6,5

最後一行:隊頭6由於已經不在視窗範圍內故刪除

//v:待處理元素;w:視窗大小

vector<

int>

maxslidewindow

(vector<

int> v,

int w)

q.push_back

(i);

}for

(int i = w; i < v.

size()

; i++

)//當隊頭元素(最大值)不在視窗範圍內時刪除隊頭元素

while

(!q.

empty()

&& q.

front()

<= i-w)

q.push_back

(i);

} res.

push_back

(v[q.

front()

]);return res;

}

個人感覺難點在於刪除隊頭元素(最大值)這一部分,下面在進行說明

對於第i個元素,若其是當前視窗的最大值,那麼其有效的範圍為[i-w+1,i]

元素 :2 3 4 2 6 2 5 1

下標 :0 1 2 3 4 5 6 7

從第三個元素4開始:

滑動視窗最值

滑動視窗最值問題 給定乙個陣列 nums 和滑動視窗的大小 k,請找出所有滑動視窗裡的最大值。示例 輸入 nums 1,3,1,3,5,3,6,7 和 k 3 輸出 3,3,5,5,6,7 解釋 滑動視窗的位置 最大值 1 3 1 3 5 3 6 7 3 1 3 1 3 5 3 6 7 3 1 3 ...

演算法 陣列 滑動視窗

閒著無聊開啟as擼個小演算法吧 給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為 針對陣列的滑動視窗有以下6個 public arraylistmaxinwindows int num,int size ...

滑動視窗(poj,線段樹維護區間最值)

現在有一堆數字共n個數字 n 10 6 以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。例如 the array is 1 3 1 3 5 3 6 7 and k 3.輸入格式 輸入一共有兩行,第一行為n,k。第二行為n個數 輸出格式 輸出...