給你乙個整數陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。
返回滑動視窗中的最大值。
求每個視窗內部的最大值問題,就等同於求連續特定區間內部的最大值最小值問題,這就是單調佇列的應用之一。
單調佇列用雙端佇列實現。常用的queue在沒有指定容器的條件下,用的底層就是雙端佇列。注意:單調佇列不是並不是優先順序佇列,儲存了所有的元素。它只保留可能成為最大(小)元素。
設計單調(遞減)佇列的規則:
1. 如果視窗移除的元素value等於單調佇列的出口元素,那麼佇列彈出元素,否則不用任何操作
2.如果push的元素value大於入口元素的數值,那麼就將佇列入口的元素彈出,直到push元素的數值小於等於佇列入口元素的數值為止
上面是**隨想錄的carl大佬總結。
1class
solution 14}
1516
//每次需要進入元素,要與單調佇列尾部部元素進行比較。
17//
如果要進入元素比單調佇列元素的值大,就將單調佇列中小於要進入的元素從佇列尾部彈出
18//
直到push的值小於等於單調佇列元素為止。這樣就保持了單調遞減的性質
19void push(int
x)23 que.push_back(x);//
從佇列尾部加入元素x24}
25int
front()
28};
29public
:30 vector maxslidingwindow(vector& nums, int
k) 37
res.push_back(que.front());
38//
開始進行視窗滑動,視窗每向前移動一次,視窗要移除元素,加入元素
39//
並且返回單調佇列的頭部元素(儲存了最大值)加入res
40for(int i = k;i < nums.size();i++)
45return
res;
4647
}48 };
時間複雜度o(n),空間複雜度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...