最開始的想法是維護乙個list,每次滑動移除nums[left]加入nums[right],並對list進行重新排序,取出最大的值即可,但是最後超時
學習之後決定使用雙端佇列
總體的基本思想就是維護住乙個依次遞減的雙端佇列
總結為:以下幾點
1.隊首元素是當前的最大元素,如果新元素小於隊尾元素,那麼就直接加入隊尾,如果大於隊尾元素,則隊尾元素出隊
2.判斷當前視窗的第乙個元素是否和隊頭元素相等,如果相等隊頭元素出隊
3.繼續然後按照規則進行入隊,維護單調遞減佇列。
第乙個版本因為時間複雜度太高需要進行重排序,所以不能使用了49 / 60 個通過測試用例
第二個版本是使用雙端佇列linkedlist完美解決
public
int[
]maxslidingwindow
(int
nums,
int k);}
int[
] ans =
newint
[n-k+1]
;for
(int i=
0;i)while
(rightcollections.
sort
(temp)
; ans[left]
=temp.
get(k-1)
;return ans;
}public
int[
]maxslidingwindow2
(int
nums,
int k)
int[
] ans =
newint
[n-k+1]
; temp.
offer
(nums[0]
);for(
int i=
1;i) temp.
offer
(nums[i]);
}while
(rightwhile
(!temp.
isempty()
&& nums[right]
>temp.
getlast()
) temp.
offer
(nums[right]);
right++
; left++;}
ans[left]
=temp.
getfirst()
;return ans;
}
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 解釋 滑動視窗的位置...