給你乙個zheng's陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。
返回滑動視窗中的最大值。
示例1:
輸入: 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 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
示例 2:
輸入:nums = [1], k = 1
輸出:[1]
示例 3:
輸入:nums = [1,-1], k = 1
輸出:[1,-1]
示例 4:
輸入:nums = [9,11], k = 2
輸出:[11]
示例 5:
輸入:nums = [4,-2], k = 2
輸出:[4]
本題因為暴力解法會超時,所以只講解單調棧策略。一看題目,每次都需要返回乙個區間內的最大值,我們自然而然會想到大頂堆,但是大頂堆有個問題就是不能反映視窗滑動的過程,即視窗向右移動,無法刪除視窗左邊劃出的元素。
所以本題要用一種特殊的資料結構——雙端佇列,我們每次向佇列右端新增數字,需要滿足以下條件:當前nums[i]
小於佇列中最右端的元素,如果nums[i]
大於佇列中最右端的元素,則需要將佇列中右端元素從右邊出隊,即要保證佇列中元素是乙個遞減序列。然後取出隊頭元素,即佇列中最左端的元素加入結果陣列中。最後,需要判斷劃出視窗的元素是否是當前佇列的隊頭,即是否是當前佇列中的最大元素,如果是,需要將隊頭元素從佇列左端出隊。一開始時,我們需要通過第一步的條件依次向佇列中加入k
個元素。
具體**如下:
class solution ;
int result = new int[nums.length - k + 1];
dequedeque = new arraydeque<>();
for (int i = 0, index = 0; i < nums.length && index < result.length; i++)
//將當前元素加入佇列
deque.offerlast(nums[i]);
//如果滿足視窗大小的情況下
if (i >= k - 1) }}
return result;}}
239 滑動視窗最大值
給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。返回滑動視窗中的最大值。示例 輸入 nums 1,3,1,3,5,3,6,7 和 k 3 輸出 3,3,5,5,6,7 解釋 滑動視窗的位置 最大...
239 滑動視窗最大值
239.滑動視窗最大值 solution deque solution maxindex 暴力法的時間複雜度為 o n k 弊端為每次掃瞄視窗的最大值,每兩次掃瞄之間都會存在重複的值比較,已經知道了他們的最大值是誰了,所以要減少比較次數 為什麼新增的是索引 將i加到隊尾 deque.addlast ...
239 滑動視窗最大值
給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。返回滑動視窗中的最大值。高階 示例 輸入 nums 1,3,1,3,5,3,6,7 和 k 3 輸出 3,3,5,5,6,7 解釋 滑動視窗的位置...