中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

LeetCode怎樣找出滑動窗口的最大值

發布時間:2021-12-15 15:02:38 來源:億速云 閱讀:273 作者:小新 欄目:大數據

小編給大家分享一下LeetCode怎樣找出滑動窗口的最大值,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

 

題目描述:

給定一個數組 nums 和滑動窗口的大小 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 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7

 

思路分析:

考慮到這道題的數組要求可以頭部進去、刪除,尾部進去,刪除,所以使用雙端隊列Deque。使用雙端隊列的單調雙端隊列LinkedList實現。

所謂的單調,就是我們人為規定從隊列的頭部到尾部,所存儲的元素是依次遞減(或依次遞增)的。

也就是說,我們維護一個單調的雙向隊列,窗口在每次滑動的時候,我就從隊列頭部取當前窗口中的最大值,每次窗口新進來一個元素的時候,我就將它與隊列中的元素進行大小比較:

如果剛剛進來的元素比隊列的尾部元素大,那么先將隊列尾部的元素彈出,然后把剛剛進來的元素添到隊列的尾部;
如果剛剛進來的元素比隊列的尾部元素小,那么把剛剛進來的元素直接添到隊列的尾部即可。

因此,通過這種既能從頭部進出,又能從尾部進出的結構,來維持窗口的最大值的。

 

Python代碼

# -*- coding:utf-8 -*-
class Solution:
    def maxInWindows(self, num, size):
        # write code here
        # 存放可能是最大值的下標
        maxqueue = []
        # 存放窗口中最大值
        maxlist = []
        n = len(num)
        # 參數檢驗
        if n == 0 or size == 0 or size > n:
            return maxlist
        for i in range(n):
            # 判斷隊首下標對應的元素是否已經滑出窗口
            if len(maxqueue) > 0 and i - size >= maxqueue[0]:
                maxqueue.pop(0)
            while len(maxqueue) > 0 and num[i] > num[maxqueue[-1]]:
                maxqueue.pop()
            maxqueue.append(i)
            if i >= size - 1:
                maxlist.append(num[maxqueue[0]])
        return maxlist
   

java代碼:

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        Deque<Integer> deque=new LinkedList<>();
        int len=nums.length;
        if(len==0 ||k==0 ){
            return new int[0] ;
        }
        int[] res=new int[len-k+1];
        
        for(int i=0;i<k;i++){
            while(!deque.isEmpty() && nums[i]>deque.peekLast()){
                deque.removeLast(); //比隊列元素大就彈出隊尾數據
            
            }
            deque.addLast(nums[i]);//不走循環直接加到隊列末尾
            
        }
        res[0]=deque.peekFirst();
        for(int i=k;i<len;i++){
            // 如果滑動窗口已經略過了隊列中頭部的元素,則將頭部元素彈出
            if(deque.peekFirst() == nums[i - k]){
                deque.removeFirst();//
            }
            while(!deque.isEmpty() && deque.peekLast() < nums[i]){
                deque.removeLast();
            }
            deque.addLast(nums[i]);
            res[i - k + 1] = deque.peekFirst();


        }
        return res;
    }
}

以上是“LeetCode怎樣找出滑動窗口的最大值”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

古蔺县| 五华县| 静宁县| 汤阴县| 家居| 丁青县| SHOW| 乐都县| 昌宁县| 北海市| 海林市| 伽师县| 松滋市| 阿拉尔市| 灵山县| 巢湖市| 吴堡县| 余江县| 格尔木市| 利辛县| 宁阳县| 嵩明县| 岱山县| 南乐县| 台山市| 荔波县| 泸定县| 拉孜县| 资兴市| 九江市| 翁牛特旗| 龙岩市| 永春县| 讷河市| 沧源| 纳雍县| 丹阳市| 汾阳市| 弥勒县| 吉安市| 峨眉山市|