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佇列
- [劍指offer題解][Java]佇列的最大值/滑動視窗的最大值Java佇列
- 滑動視窗法——Leetcode例題LeetCode
- 演算法題:返回滑動視窗中的最大值演算法
- 滑動視窗分析SQL實踐SQL
- 使用 Redis 實現限流——滑動視窗演算法Redis演算法
- 演算法~利用zset實現滑動視窗限流演算法
- 程式碼隨想錄 第13天 | ● 239. 滑動視窗最大值 ● 347.前 K 個高頻元素 ● 總結
- 「LeetCode Top100」之滑動視窗LeetCode
- Sentinel 原理-滑動視窗
- Golang的滑動視窗計數器Redis限速實現GolangRedis
- 原生js實現圖片瀑布流佈局,註釋超詳細JS
- [每日一題] 第二十六題:滑動視窗的最大值每日一題
- 滑動視窗演算法演算法
- [分散式限流] 滑動視窗演算法的 Golang 實現分散式演算法Golang
- Leetcode 最小調整數+滑動視窗遞增子序列LeetCode
- Hive實戰—時間滑動視窗計算Hive
- Java註解最全詳解(超級詳細)Java
- 透過滑動視窗實現介面呼叫的多種限制策略
- TCP 流量控制-滑動視窗TCP
- 滑動視窗演算法思路演算法
- Sentinel滑動視窗演算法演算法
- 滑動視窗問題總結
- 滑動視窗與雙指標指標
- Flink的滾動視窗、會話視窗、滑動視窗及其應用會話
- 抖動視窗的實現
- mysql視窗函式中的滑動視窗MySql函式
- Go語言實現時間滑動視窗演算法 動態計算增加量、最大值、最小值Go演算法
- Day10(棧與佇列) | 150. 逆波蘭表示式求值 239. 滑動視窗最大值 347.前 K 個高頻元素佇列