国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

數據結構與算法隨筆之優先隊列-求滑動窗口最大值(三)

Joyven / 2748人閱讀

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

這篇文章我們來看一道題目求滑動窗口最大值問題(在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;
        //用優先隊列構建最大堆
        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]);
            }
            //把移進窗口的數據加入最大堆,最大值一定會在堆頂
            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;
        ArrayDeque queue = new ArrayDeque<>(k);
        for(int i=0;i

復雜度分析

時間復雜度:O(n)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71820.html

相關文章

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

    摘要:你只可以看到在滑動窗口內的數字。滑動窗口每次只向右移動一位。返回滑動窗口最大值。算法思路暴力破解法用兩個指針,分別指向窗口的起始位置和終止位置,然后遍歷窗口中的數據,求出最大值向前移動兩個指針,然后操作,直到遍歷數據完成位置。 Time:2019/4/16Title: Sliding Window MaximumDifficulty: DifficultyAuthor: 小鹿 題目...

    spacewander 評論0 收藏0
  • 如何使用數組實現滑動窗口

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

    不知名網友 評論0 收藏0

發表評論

0條評論

Joyven

|高級講師

TA的文章

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