給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。
返回滑動視窗中的最大值。
示例:
輸入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
輸出: [3,3,5,5,6,7]
解釋:
滑動視窗的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
一、暴力求解,一層迴圈遍歷n-k+1
次,二層迴圈遍歷k的長度,時間複雜度為o(nk),存在的問題就是在視窗移動的過程中,存在元素重複的情況,k很大的時候非常明顯效率很低。
二、使用單調的雙向佇列,維護的佇列支援雙端操作,元素在入隊出隊的時候保證o(1)的時間操作,並且我們需要淘汰掉永遠不可能是當前的答案的元素。
//暴力解 時間複雜度上面 (n-k+1) * k 存在問題,大量的重複比較
public
int[
]maxslidingwindow
(int
nums,
int k)
return res;
}
//單調雙端佇列 deque o(n) 單詞滑動視窗獲取最大值 o(1) max --> min
//將永遠沒有機會的消除, 減少重複的比較
public
int[
]solve
(int
nums,
int k)
//移除尾部小於當前值的元素
while
(!dq.
isempty()
&& nums[i]
>= nums[dq.
getlast()
])//尾部加入,滑動視窗向右擴充
dq.addlast
(i);
//從頭部返回極大值
if(i >= k -1)
}return res;
}
滑動視窗leetcode
給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗 k 內的數字。滑動視窗每次只向右移動一位。返回滑動視窗最大值。示例 輸入 nums 1,3,1,3,5,3,6,7 和 k 3輸出 3,3,5,5,6,7 解釋 滑動視窗的位置 最大值 1 ...
leetcode 滑動視窗
面試題57 ii.和為s的連續正數序列 題目 輸入乙個正整數 target 輸出所有和為 target 的連續正整數序列 至少含有兩個數 序列內的數字由小到大排列,不同序列按照首個數字從小到大排列。題解 摘自 什麼是滑動視窗 滑動視窗可以看成陣列中框起來的乙個部分。在一些陣列類題目中,我們可以用滑動...
leetcode 滑動視窗
3.無重複字元的最長子串 給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。示例 1 輸入 abcabcbb 輸出 3解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pww...