Leetcode 239. 滑動視窗最大值 (Java實現 超詳細註釋!)
Leetcode 239. 滑動視窗最大值
涉及雙向佇列,說實話有點難理解啊!加了詳細的註釋,方便日後複習,也希望能幫到其他小夥伴,如有錯誤,歡迎指正!
Java實現:
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
// 由於滑動視窗本質就是每次刪除最前面的一個元素,新增一個元素再後面,因此這裡我們用雙向佇列儲存滑動視窗內的元素,方便增刪
Deque<Integer> dq = new LinkedList<Integer>();
// res用來儲存每次滑動視窗內的最大值
int[] res = new int[n - k + 1];
// 移動滑動視窗,其實就是從前往後移動,每一移動一位
for (int i = 0; i < n; i++){
// 由於我們需要找到滑動視窗內的最大值,我們可以採取這樣的方法:
// 我們讓佇列頭部放最大值的索引(用索引是因為後面需要判斷是否要刪除已經越界的元素),佇列的尾部存較小且靠後的元素
/**我們怎麼才能做到上述呢?
頭部放最大的元素就是每次移動視窗時都從後往前比較新元素和老元素的大小,只要新元素更大就不斷地替換老元素,直到已經沒有老元素了
怎麼保證佇列的尾部存較小且靠後的元素?我們可以在新元素小於最後一個老元素時,將新元素放在佇列的尾部;
*/
while (!dq.isEmpty() && nums[dq.getLast()] <= nums[i]){
dq.pollLast();
}
dq.offerLast(i);
/**此時這次的視窗滑動已經結束了,我們要考慮是否有上一次的老元素越界的情況,因為是按順序儲存的,第一個元素一定是最靠前的元素;
因此只有可能該元素越界,我們判斷該元素的索引是否等於i - k,等於說明越界,直接刪除*/
if (dq.peekFirst() == i - k){
dq.pollFirst();
}
// 到這一步我們需要獲取視窗內的最大值了,由於不滿三個元素時,不需要求最大值,從遍歷到第k個元素開始才需要求最大值
if (i >= k - 1){
// 由於最大的會一直往前挪,佇列頭部的元素此時一定是視窗內的元素,直接存入res中即可
res[i - k + 1] = nums[dq.peekFirst()];
}
}
return res;
}
}
相關文章
- LeetCode 239. 滑動視窗最大值LeetCode
- 239. 滑動視窗最大值
- 滑動視窗最大值的golang實現Golang
- Leetcode 239 滑動視窗最大值 與堆排序kotlin語言(超時)LeetCode排序Kotlin
- 滑動視窗的最大值
- 滑動視窗最大值問題
- 細聊滑動視窗
- [Python手撕]滑動視窗最大值Python
- 滑動視窗的最大值問題
- [Leetcode]雙項佇列解決滑動視窗最大值難題LeetCode佇列
- 滑動視窗最大值——棧與佇列佇列
- JZ-064-滑動視窗的最大值
- 滑動視窗濾波器原理分析及詳細程式碼講解實現
- 滑動視窗法——Leetcode例題LeetCode
- [劍指offer題解][Java]佇列的最大值/滑動視窗的最大值Java佇列
- 劍指offer(59)——滑動視窗的最大值
- 自己實現一個滑動視窗
- 「LeetCode Top100」之滑動視窗LeetCode
- 騰訊面試題-求滑動視窗的最大值面試題
- 演算法題:返回滑動視窗中的最大值演算法
- 程式碼隨想錄 第13天 | ● 239. 滑動視窗最大值 ● 347.前 K 個高頻元素 ● 總結
- 原生js實現圖片瀑布流佈局,註釋超詳細JS
- 演算法~利用zset實現滑動視窗限流演算法
- 使用 Redis 實現限流——滑動視窗演算法Redis演算法
- Leetcode 最小調整數+滑動視窗遞增子序列LeetCode
- Java註解最全詳解(超級詳細)Java
- 力扣 - 劍指 Offer 59 - I. 滑動視窗的最大值力扣
- (超詳細)動手編寫-連結串列(Java實現)Java
- (超詳細)動手編寫 — 棧、佇列 ( Java實現 )佇列Java
- Golang的滑動視窗計數器Redis限速實現GolangRedis
- (轉)leetcode:Find All Anagrams in a String 滑動視窗方法總結LeetCode
- [每日一題] 第二十六題:滑動視窗的最大值每日一題
- 滑動視窗專題
- Sentinel 原理-滑動視窗
- Python實現快遞分揀小程式(附原始碼和超詳細註釋)Python原始碼
- JS實現輪播圖效果(有詳細註釋)JS
- Go語言實現時間滑動視窗演算法 動態計算增加量、最大值、最小值Go演算法
- Day10(棧與佇列) | 150. 逆波蘭表示式求值 239. 滑動視窗最大值 347.前 K 個高頻元素佇列