摘要:你只可以看到在滑動(dòng)窗口內(nèi)的數(shù)字。滑動(dòng)窗口每次只向右移動(dòng)一位。返回滑動(dòng)窗口最大值。
這篇文章我們來(lái)看一道題目求滑動(dòng)窗口最大值問(wèn)題(在leetcode上的地址:滑動(dòng)窗口最大值)
題目描述給定一個(gè)長(zhǎng)度為N的數(shù)組 nums,有一個(gè)大小為 k 的滑動(dòng)窗口從數(shù)組的最左側(cè)移動(dòng)到數(shù)組的最右側(cè)。你只可以看到在滑動(dòng)窗口 k 內(nèi)的數(shù)字。滑動(dòng)窗口每次只向右移動(dòng)一位。返回滑動(dòng)窗口最大值。
示例:
輸入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 輸出: [3,3,5,5,6,7]解決方案
一、使用最大堆來(lái)實(shí)現(xiàn)
首先定義一個(gè)大小為K的最大堆,把窗口里面的數(shù)據(jù)入堆,這樣堆頂?shù)臄?shù)據(jù)就是最大值,當(dāng)窗口向右移動(dòng)的時(shí)候,我們還需要做的一件事情就是把不在窗口的數(shù)據(jù)移出堆,把進(jìn)入窗口的數(shù)據(jù)放入堆,此時(shí)堆也會(huì)做相應(yīng)調(diào)整,維持最大值在堆頂。代碼如下:
public class SlidingWindow { public int[] maxSlidingWindow(int[] nums, int k) { if(nums == null || nums.length == 0 || k < 1 || k > nums.length) { return null; } if(k == 1) { return nums; } int[] result = new int[nums.length - k + 1]; int j = 0; //用優(yōu)先隊(duì)列構(gòu)建最大堆 PriorityQueuequeue = new PriorityQueue<>(k, new Comparator () { @Override public int compare(Integer o1, Integer o2) { if(o1.compareTo(o2) == 0) { return 0; }else if(o1.compareTo(o2) > 0) { return -1; }else { return 1; } } }); for(int i=0;i 0) { queue.remove(nums[i-k]); } //把移進(jìn)窗口的數(shù)據(jù)加入最大堆,最大值一定會(huì)在堆頂 queue.add(nums[i]); if(i-k+1 < 0) { continue; } result[j++] = queue.peek(); } return result; } }
復(fù)雜度分析
時(shí)間復(fù)雜度:O(nlogk)
二、使用雙端隊(duì)列來(lái)實(shí)現(xiàn)
定義一個(gè)大小為K的雙端隊(duì)列,把窗口里的數(shù)據(jù)放入隊(duì)列,每次入隊(duì)的時(shí)候進(jìn)行判斷,隊(duì)列里面小于入隊(duì)數(shù)據(jù)時(shí),需要出隊(duì),一定保持最大值在隊(duì)列的最左端,代碼實(shí)現(xiàn)如下:
public class SlidingWindow { public int[] maxSlidingWindow(int[] nums, int k) { if(nums == null || nums.length == 0 || k < 1 || k > nums.length) { return null; } if(k == 1) { return nums; } int[] result = new int[nums.length - k + 1]; int m = 0; ArrayDequequeue = new ArrayDeque<>(k); for(int i=0;i 復(fù)雜度分析
時(shí)間復(fù)雜度:O(n)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71820.html
摘要:你只可以看到在滑動(dòng)窗口內(nèi)的數(shù)字?;瑒?dòng)窗口每次只向右移動(dòng)一位。返回滑動(dòng)窗口最大值。算法思路暴力破解法用兩個(gè)指針,分別指向窗口的起始位置和終止位置,然后遍歷窗口中的數(shù)據(jù),求出最大值向前移動(dòng)兩個(gè)指針,然后操作,直到遍歷數(shù)據(jù)完成位置。 Time:2019/4/16Title: Sliding Window MaximumDifficulty: DifficultyAuthor: 小鹿 題目...
摘要:理解數(shù)組實(shí)現(xiàn)的滑動(dòng)窗口,看下邊這個(gè)圖就可以了。第秒,開(kāi)始計(jì)數(shù),此時(shí)數(shù)組內(nèi)開(kāi)始存入計(jì)數(shù)周期,保存在數(shù)組第個(gè)位置,表示這是當(dāng)前滑動(dòng)窗口內(nèi)的第個(gè)計(jì)數(shù)周期。在FireflySoft.RateLimit之前的版本中,進(jìn)程內(nèi)滑動(dòng)窗口的實(shí)現(xiàn)是基于MemoryCache做的,雖然能夠正確的實(shí)現(xiàn)滑動(dòng)窗口的算法邏輯,但是性能比較差,其吞吐量只有其它算法的1/4。性能為何如此之差呢?滑動(dòng)窗口的原理我們先來(lái)看下滑動(dòng)...
閱讀 673·2021-11-24 09:39
閱讀 2342·2021-11-22 13:54
閱讀 2210·2021-09-23 11:46
閱讀 3254·2019-08-30 15:55
閱讀 2690·2019-08-30 15:54
閱讀 2414·2019-08-30 14:18
閱讀 1554·2019-08-29 14:15
閱讀 2743·2019-08-29 13:49