給定乙個陣列 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...