LeetCode239 滑動視窗最大值

2022-06-08 19:45:10 字數 1115 閱讀 4659

給你乙個整數陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。

返回滑動視窗中的最大值。

求每個視窗內部的最大值問題,就等同於求連續特定區間內部的最大值最小值問題,這就是單調佇列的應用之一。

單調佇列用雙端佇列實現。常用的queue在沒有指定容器的條件下,用的底層就是雙端佇列。注意:單調佇列不是並不是優先順序佇列,儲存了所有的元素。它只保留可能成為最大(小)元素。

設計單調(遞減)佇列的規則:

1. 如果視窗移除的元素value等於單調佇列的出口元素,那麼佇列彈出元素,否則不用任何操作

2.如果push的元素value大於入口元素的數值,那麼就將佇列入口的元素彈出,直到push元素的數值小於等於佇列入口元素的數值為止

上面是**隨想錄的carl大佬總結。

1

class

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...