亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

Joyven / 2814人閱讀

摘要:你只可以看到在滑動窗口內(nèi)的數(shù)字?;瑒哟翱诿看沃幌蛴乙苿右晃?。返回滑動窗口最大值。

這篇文章我們來看一道題目求滑動窗口最大值問題(在leetcode上的地址:滑動窗口最大值)

題目描述

給定一個長度為N的數(shù)組 nums,有一個大小為 k 的滑動窗口從數(shù)組的最左側(cè)移動到數(shù)組的最右側(cè)。你只可以看到在滑動窗口 k 內(nèi)的數(shù)字。滑動窗口每次只向右移動一位。返回滑動窗口最大值。

示例:

輸入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
輸出: [3,3,5,5,6,7]
解決方案

一、使用最大堆來實(shí)現(xiàn)

首先定義一個大小為K的最大堆,把窗口里面的數(shù)據(jù)入堆,這樣堆頂?shù)臄?shù)據(jù)就是最大值,當(dāng)窗口向右移動的時(shí)候,我們還需要做的一件事情就是把不在窗口的數(shù)據(jù)移出堆,把進(jìn)入窗口的數(shù)據(jù)放入堆,此時(shí)堆也會做相應(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ù)加入最大堆,最大值一定會在堆頂
            queue.add(nums[i]);
            if(i-k+1 < 0) {
                continue;
            }
            result[j++] = queue.peek();
        }
        return result;
    }
}

復(fù)雜度分析

時(shí)間復(fù)雜度:O(nlogk)

二、使用雙端隊(duì)列來實(shí)現(xiàn)

定義一個大小為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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/71820.html

相關(guān)文章

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

    摘要:你只可以看到在滑動窗口內(nèi)的數(shù)字?;瑒哟翱诿看沃幌蛴乙苿右晃?。返回滑動窗口最大值。算法思路暴力破解法用兩個指針,分別指向窗口的起始位置和終止位置,然后遍歷窗口中的數(shù)據(jù),求出最大值向前移動兩個指針,然后操作,直到遍歷數(shù)據(jù)完成位置。 Time:2019/4/16Title: Sliding Window MaximumDifficulty: DifficultyAuthor: 小鹿 題目...

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

    摘要:理解數(shù)組實(shí)現(xiàn)的滑動窗口,看下邊這個圖就可以了。第秒,開始計(jì)數(shù),此時(shí)數(shù)組內(nèi)開始存入計(jì)數(shù)周期,保存在數(shù)組第個位置,表示這是當(dāng)前滑動窗口內(nèi)的第個計(jì)數(shù)周期。在FireflySoft.RateLimit之前的版本中,進(jìn)程內(nèi)滑動窗口的實(shí)現(xiàn)是基于MemoryCache做的,雖然能夠正確的實(shí)現(xiàn)滑動窗口的算法邏輯,但是性能比較差,其吞吐量只有其它算法的1/4。性能為何如此之差呢?滑動窗口的原理我們先來看下滑動...

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

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<