大頂堆刪除最大值 239 滑動視窗最大值

2021-10-13 15:37:40 字數 1748 閱讀 6083

給你乙個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 解釋 滑動視窗的位置...