leetcode 滑動視窗最大值

2021-10-07 12:38:29 字數 1264 閱讀 8867

給定乙個陣列 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 731 [3 -1 -3] 5 3 6 731 3 [-1 -3 5] 3 6 751 3 -1 [-3 5 3] 6 751 3 -1 -3 [5 3 6] 761 3 -1 -3 5 [3 6 7]7

使

用雙向佇列,在遇到新的數的時候,將新的數和雙向佇列的末尾進行比較,如果末尾的數比新數小,則把末尾的數扔掉,直到該佇列的末尾數比新數大或者隊列為空的時候才停止。這樣,我們可以保證佇列裡的元素是重頭到位的降序。由於佇列中只有視窗裡的數,就是視窗裡的第一大數,第二大數,第三數...。

如何保持佇列呢。每當滑動視窗的k已滿,想要新進來乙個數,就需要把滑動視窗最左邊的數移出佇列,新增新的數。

我們在新增新的數的時候,就已經移出了一些數,這樣佇列頭部的數不一定是視窗最左邊的數。技巧:我們佇列中只儲存那個數在原陣列的下標。這樣可以判斷該數是否為最滑動視窗的最左邊的數。

為什麼這個解法的時間複雜度是o(n)呢。因為每個元素在雙端佇列裡有且僅存在過一次。即最多被操作兩次,一次是加入該佇列的時候,一次是因為後面有更大的數而被移除佇列的時候

class solution 

arraydequeadq = new arraydeque(k);

int res = new int[nums.length + 1 - k];//獲得該nums陣列滑動視窗的個數

for(int i = 0; i < nums.length; i++)

return res;

}}

leetcode 滑動視窗最大值

如果只是想做大這件事件非常簡單,在每一段都取max即可,但是顯然這樣當k n 2 的時候不符合線性時間複雜度的要求,所以我們維護乙個列表,放其中的k個數字,然後沒加入乙個新的數字的時候都對其做一定的判斷,將不滿足條件的元素變為false,然後pop掉最前面的元素以及前面的所有false,然後非常容易...

leetcode 滑動視窗最大值問題

class solution 如果push的數值大於入口元素的數值,那麼就將佇列後端的數值彈出,直到push的數值小於等於佇列入口元素的數值為止。這樣就保持了佇列裡的數值是單調從大到小的了。void push int value que.push back value 查詢當前佇列裡的最大值 直接返...

滑動視窗最大值

題目描述 給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為 針對陣列的滑動視窗有以下6個 幾個注意點 利用雙端佇列實現,如果後者比前者大,前者丟擲,後者進,如果比前者小,壓入佇列,判斷隊頭是否過期,這就需...