摘要:你只可以看到在滑動窗口內的數字?;瑒哟翱诿看沃幌蛴乙苿右晃?。返回滑動窗口最大值。
這篇文章我們來看一道題目求滑動窗口最大值問題(在leetcode上的地址:滑動窗口最大值)
題目描述給定一個長度為N的數組 nums,有一個大小為 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口 k 內的數字?;瑒哟翱诿看沃幌蛴乙苿右晃?。返回滑動窗口最大值。
示例:
輸入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 輸出: [3,3,5,5,6,7]解決方案
一、使用最大堆來實現
首先定義一個大小為K的最大堆,把窗口里面的數據入堆,這樣堆頂的數據就是最大值,當窗口向右移動的時候,我們還需要做的一件事情就是把不在窗口的數據移出堆,把進入窗口的數據放入堆,此時堆也會做相應調整,維持最大值在堆頂。代碼如下:
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; //用優先隊列構建最大堆 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]); } //把移進窗口的數據加入最大堆,最大值一定會在堆頂 queue.add(nums[i]); if(i-k+1 < 0) { continue; } result[j++] = queue.peek(); } return result; } }
復雜度分析
時間復雜度:O(nlogk)
二、使用雙端隊列來實現
定義一個大小為K的雙端隊列,把窗口里的數據放入隊列,每次入隊的時候進行判斷,隊列里面小于入隊數據時,需要出隊,一定保持最大值在隊列的最左端,代碼實現如下:
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 復雜度分析
時間復雜度:O(n)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71820.html
摘要:你只可以看到在滑動窗口內的數字。滑動窗口每次只向右移動一位。返回滑動窗口最大值。算法思路暴力破解法用兩個指針,分別指向窗口的起始位置和終止位置,然后遍歷窗口中的數據,求出最大值向前移動兩個指針,然后操作,直到遍歷數據完成位置。 Time:2019/4/16Title: Sliding Window MaximumDifficulty: DifficultyAuthor: 小鹿 題目...
摘要:理解數組實現的滑動窗口,看下邊這個圖就可以了。第秒,開始計數,此時數組內開始存入計數周期,保存在數組第個位置,表示這是當前滑動窗口內的第個計數周期。在FireflySoft.RateLimit之前的版本中,進程內滑動窗口的實現是基于MemoryCache做的,雖然能夠正確的實現滑動窗口的算法邏輯,但是性能比較差,其吞吐量只有其它算法的1/4。性能為何如此之差呢?滑動窗口的原理我們先來看下滑動...
閱讀 662·2021-11-24 09:39
閱讀 2315·2021-11-22 13:54
閱讀 2197·2021-09-23 11:46
閱讀 3246·2019-08-30 15:55
閱讀 2679·2019-08-30 15:54
閱讀 2403·2019-08-30 14:18
閱讀 1546·2019-08-29 14:15
閱讀 2732·2019-08-29 13:49