給定乙個陣列 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...