這個時候整個演算法的時間複雜度就為:o(nclass solution {
public int maxslidingwindow(int nums, int k) {
int numlen = nums.length;
if(nums == null || numlenmaxheap = new priorityqueue((a,b)->nums[b]-nums[a]);
for(int i=0;i這個時候的時間複雜度為:o(n
⋅logk
)o(n \cdot \log k)
o(n⋅
logk
),我們可以用雙向佇列來求解此問題更加簡化了時間複雜度,整個過程如下圖所示:
假設有乙個陣列 [1,
3,−1
,−3,
5,3,
6,7]
[1,3, - 1, - 3,5,3,6,7]
[1,3,−
1,−3
,5,3
,6,7
],k=
3k=3
k=3,我們用雙端佇列,每一輪進行移動視窗、維護和輸出的動作,每一輪使最大的數在視窗的最左端,如果視窗中左邊的元素要小於右邊的元素,那麼就把左邊的元素進行清除維護,最終就能輸出結果,圖中紅色的部分表示視窗的位置。**如下:
class solution(object):
def maxslidingwindow(self, nums, k):
""":type nums: list[int]
:type k: int
:rtype: list[int]
"""if not nums:
return
window, res = ,
for i, x in enumerate(nums):
if i >= k and window[0] <= i - k:
window.pop(0)
while window and nums[window[-1]] <= x:
window.pop()
if i >= k-1:
return res
)o(n)
o(n)
,比上面用優先佇列的方法時間複雜度要低很多。這就是滑動視窗中用優先佇列和雙向佇列的解法,希望對大家有所幫助,謝謝。
LeetCode 239 滑動視窗最大值
給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗 k 內的數字。滑動視窗每次只向右移動一位。返回滑動視窗最大值。示例 輸入 nums 1,3,1,3,5,3,6,7 和 k 3 輸出 3,3,5,5,6,7 解釋 滑動視窗的位置 最大值 1...
leetcode239滑動視窗最大值
給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗 k 內的數字。滑動視窗每次只向右移動一位。返回滑動視窗最大值。示例 輸入 nums 1,3,1,3,5,3,6,7 和 k 3 輸出 3,3,5,5,6,7 解釋 滑動視窗的位置 最大值 1...
LeetCode 239 滑動視窗最大值
239 滑動視窗最大值 題目 給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗 k 內的數字。滑動視窗每次只向右移動一位。返回滑動視窗最大值。示例 輸入 nums 1,3,1,3,5,3,6,7 和 k 3 輸出 3,3,5,5,6,7 解...