LeetCode 239 滑動視窗最大值

2021-09-14 03:03:12 字數 1263 閱讀 4516

class 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

⋅log⁡k

)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)

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 解...