成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

數(shù)據(jù)結(jié)構(gòu)與算法隨筆之優(yōu)先隊(duì)列-求滑動(dòng)窗口最大值(三)

Joyven / 2758人閱讀

摘要:你只可以看到在滑動(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)建最大堆
        PriorityQueue queue = 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;
        ArrayDeque queue = 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

相關(guān)文章

  • LeetCode JavaScript 解答第239題 —— 滑動(dòng)窗口大值(Sliding W

    摘要:你只可以看到在滑動(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: 小鹿 題目...

    spacewander 評(píng)論0 收藏0
  • 如何使用數(shù)組實(shí)現(xiàn)滑動(dòng)窗口

    摘要:理解數(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)...

    不知名網(wǎng)友 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<