LeetCode C 滑動視窗最大值

2021-10-07 18:13:00 字數 1439 閱讀 9245

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

返回滑動視窗中的最大值。

高階:示例:

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

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

解釋:

滑動視窗的位置 \quad

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

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

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

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

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

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

71 <= nums.length <= 10^5

-10^4 <= nums[i] <= 10^4

1 <= k <= nums.length

思路:

總結其他的部落格。

使用雙端佇列(deque)儲存滑動視窗裡元素的下標,且保證隊首為當前視窗裡面的最大元素的索引,尾部用於與當前要壓入的元素比較。

對於第乙個視窗,裡面元素為num[0]~num[k-1],每次要押入乙個下標i,將num[i]與雙端佇列(deque)尾部索引對應的元素比較,若小於,則將尾部彈出,一直到遇到大於的,此時則將下標i壓入雙端佇列尾部,因為在雙端佇列頭部彈出去後,此下標有可能為後面視窗的最大值。

對於後續視窗,我們在更新雙端佇列的時候,還需要判斷佇列的頭部是不是在視窗內,即deque.top()>=i-k。

每次迴圈,deque的頭部即為該次滑動框裡面最大值的索引。

**:

class

solution

max_idx.

push_back

(i);

//碰到比當前元素大的,就壓入當前元素索引

}

res.

push_back

(nums[max_idx.

front()

]);//儲存第乙個框的最大值

//後續的框,增加了乙個判斷條件,雙端佇列的頭部是否在框內

for(

int i=k; i

size()

;i++

)return res;}}

;

結果:

[1] zolewit:滑動視窗最大值/c++

最大滑動視窗

題目描述 給定乙個陣列a,有乙個大小為w的滑動視窗,該滑動視窗從最左邊滑到最後邊。在該視窗中你只能看到w個數字,每次只能移動乙個位置。我們的目的是找到每個視窗w個數字中的最大值,並將這些最大值儲存在陣列b中。例如陣列a 1 3 1 3 5 3 6 7 視窗大小w為3。則視窗滑動過程如下所示 wind...

最大滑動視窗

給定乙個陣列a,有乙個大小為w的滑動視窗,該滑動視窗從最左邊滑到最後邊。在該視窗中你只能看到w個數字,每次只能移動乙個位置。我們的目的是找到每個視窗w個數字中的最大值,並將這些最大值儲存在陣列b中。例如陣列a 1 3 1 3 5 3 6 7 視窗大小w為3。則視窗滑動過程如下所示 window po...

最大滑動視窗

給定乙個陣列a,有乙個大小為w的滑動視窗,該滑動視窗從最左邊滑到最後邊。在該視窗中你只能看到w個數字,每次只能移動乙個位置。我們的目的是找到每個視窗w個數字中的最大值,並將這些最大值儲存在陣列b中。例如陣列a 1 3 1 3 5 3 6 7 視窗大小w為3。則視窗滑動過程如下所示 window po...