LeetCode 239 滑動視窗最大值

2021-10-07 05:19:32 字數 1746 閱讀 9266

給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。

返回滑動視窗中的最大值。

示例:

輸入: nums =[1

,3,-

1,-3

,5,3

,6,7

], 和 k =

3輸出:[3

,3,5

,5,6

,7] 解釋:

滑動視窗的位置 最大值

----

----

-------

-----[

13-1

]-35

3673

1[3-

1-3]

5367

313[

-1-3

5]36

7513

-1[-

353]

6751

3-1-

3[53

6]76

13-1

-35[

367]

7

遍歷視窗,從0 到 nums.length - k,每個視窗遍歷選出最大值

class

solution

a[i]

= max;

}return a;

}}

時間複雜度o(n*k),迴圈遍歷視窗,每個視窗遍歷k次 找最大值

空間複雜度o(n - k + 1),大小為n-k+1的陣列存放最大值

因為視窗每一次移動一格,加入的元素可以判斷是否比最大值大,還需要考慮出去的元素是否為最大值,這樣不用 重複計算最大值。

class

solution

if(nums[i + k]

> a[i])if

(nums[i + k]

== a[i])if

(nums[i]

== a[i]

)else}}

return a;

}public

intfindmax

(int

array)

return out;

}}

時間複雜度,最壞情況,陣列是按照從大到小排序,每一次出去的都是最大值,這樣每一次都要找最大值。o(n*k)

空間複雜度o(k)+ o(n-k+1) ,放最大值陣列,n-k+1長度,找最大值的陣列 長度k

增加維護乙個雙端佇列,佇列裡面是單調排序的

這樣每次查詢最大值時間複雜度只需要o(1),在佇列中插入刪除元素的時間複雜度也是o(1)。

class

solution

// 從佇列尾刪除佇列中比加入元素小的元素

while

(!dq.

isempty()

&& nums[i]

>= nums[dq.

getlast()

])dq.

addlast

(i);

//新元素在佇列尾加入

if(i >= k -1)

}return a;

}}

時間複雜度o(n),只需要遍歷一遍陣列,在佇列中獲取最大值為o(1),插入刪除操作也為o(1)

空間複雜度o(n),輸出陣列使用了 o(n - k + 1) 空間,雙向佇列使用了 o(k)。

LeetCode 239 滑動視窗最大值

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

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