1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        ?LeetCode刷題實戰(zhàn)480:滑動窗口中位數(shù)

        共 2686字,需瀏覽 6分鐘

         ·

        2021-12-28 13:44

        算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎(chǔ)知識和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個公眾號后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

        今天和大家聊的問題叫做?滑動窗口中位數(shù),我們先來看題面:
        https://leetcode-cn.com/problems/sliding-window-median/

        中位數(shù)是有序序列最中間的那個數(shù)。如果序列的長度是偶數(shù),則沒有最中間的數(shù);此時中位數(shù)是最中間的兩個數(shù)的平均數(shù)。
        例如:
        [2,3,4],中位數(shù)是 3
        [2,3],中位數(shù)是 (2 + 3) / 2 = 2.5
        給你一個數(shù)組 nums,有一個長度為 k 的窗口從最左端滑動到最右端。窗口中有 k 個數(shù),每次窗口向右移動 1 位。你的任務(wù)是找出每次窗口移動后得到的新窗口中元素的中位數(shù),并輸出由它們組成的數(shù)組。

        示例? ? ? ? ? ? ? ? ? ? ? ? ?


        解題

        https://www.cnblogs.com/kexinxin/p/10372465.html

        題目會給一個數(shù)組,和一個滑動窗口的大小K,讓你找出當(dāng)這個窗口滑動的過程中,這個K的窗口內(nèi)的中位數(shù)分別是多少?
        最naive的方式就是在k個窗口內(nèi)排序就好,這里不解釋(因為開銷很大啊,(n-k+1) * (k*log(k))。。
        這里的方法是使用兩個優(yōu)先隊列,即出隊列的順序是按照某種排好序的方式進(jìn)行的。
        所以我們設(shè)立兩個優(yōu)先隊列,這里叫做堆吧:
        1、最大堆,值大的先出來
        2、最小堆:值小的先出來

        那么回到我們的問題,我們想想如何確定中位數(shù):
        1、假設(shè)我們有上述最大堆,最小堆
        2、如果我們把進(jìn)入的所有值較小的一半放到最大堆,較大的一半放到最小堆中,那么較小的那一半poll出來的,和較大那一半poll出來的,不正好是k個窗口的中位數(shù)的候選值么?
        3、按照上面那個思想,我們就行動,再輸入值得時候,根據(jù)其大小,放入最大堆或者最小堆中,然后調(diào)整一些大小,保證最大堆那邊的大小等于或者多一個于最小堆
        4、當(dāng)輸出的時候,也就是從最大堆取一個,或者雙方各取一個就可以計算了
        5、刪除的時候,在對應(yīng)的堆中刪除,再按照3中的方式更新下就好

        import java.util.Collections;
        import java.util.PriorityQueue;

        public?class?Solution?{
        ????public?double[] medianSlidingWindow(int[] nums, int?k) {
        ????????int?n = nums.length;
        ????????int?m = n - k + 1;
        ????????// 結(jié)果的尺寸
        ????????double[] res = new?double[m];
        ????????//兩個堆,一個最大堆,一個最小
        ????????PriorityQueue maxHeap = new?PriorityQueue(k, Collections.reverseOrder());
        ????????PriorityQueue minHeap = new?PriorityQueue(k);
        ????????for?(int?i = 0; i????????????int?num = nums[i];
        ????????????// 讓maxHeap始終保存小于一半的值,minHeap保存大于一半的,正好兩半
        ????????????if( maxHeap.size() == 0?|| maxHeap.peek() >= num) maxHeap.add(num);
        ????????????else?minHeap.add(num);
        ????????????// 維護兩個堆,保證兩個堆得大小,要么保持一致(偶數(shù)時),要么maxHeap多一個(奇數(shù)時)
        ????????????if( minHeap.size() > maxHeap.size() ) maxHeap.add(minHeap.poll());
        ????????????if( maxHeap.size() > minHeap.size() + 1?) minHeap.add(maxHeap.poll());
        ????????????// 如果需要輸出
        ????????????if?( i-k+1?>=0?){
        ????????????????if( k % 2?== 1?) res[i- k + 1] = maxHeap.peek();
        ????????????????else?res[i- k + 1] = (maxHeap.peek()/2.0?+ minHeap.peek()/2.0);
        ????????????????// 小心溢出
        ????????????????// 移除并更新
        ????????????????int?toBeRemove = nums[i - k + 1];
        ????????????????if( toBeRemove <= maxHeap.peek()) maxHeap.remove(toBeRemove);
        ????????????????else?minHeap.remove(toBeRemove);
        ????????????????// 維護兩個堆,保證兩個堆得大小,要么保持一致(偶數(shù)時),要么maxHeap多一個(奇數(shù)時)
        ????????????????if( minHeap.size() > maxHeap.size() ) maxHeap.add(minHeap.poll());
        ????????????????if( maxHeap.size() > minHeap.size() + 1?) minHeap.add(maxHeap.poll());
        ????????????}
        ????????}
        ????????return?res;
        ????}
        }


        好了,今天的文章就到這里,如果覺得有所收獲,請順手點個在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動力 。

        上期推文:

        LeetCode1-460題匯總,希望對你有點幫助!

        LeetCode刷題實戰(zhàn)461:漢明距離

        LeetCode刷題實戰(zhàn)462:最少移動次數(shù)使數(shù)組元素相等 II

        LeetCode刷題實戰(zhàn)463:島嶼的周長

        LeetCode刷題實戰(zhàn)464:我能贏嗎

        LeetCode刷題實戰(zhàn)465:最優(yōu)賬單平衡

        LeetCode刷題實戰(zhàn)466:統(tǒng)計重復(fù)個數(shù)

        LeetCode刷題實戰(zhàn)467:環(huán)繞字符串中唯一的子字符串

        LeetCode刷題實戰(zhàn)468:驗證IP地址

        LeetCode刷題實戰(zhàn)469:凸多邊形

        LeetCode刷題實戰(zhàn)470:用 Rand7() 實現(xiàn) Rand10()

        LeetCode刷題實戰(zhàn)471:編碼最短長度的字符串

        LeetCode刷題實戰(zhàn)472:連接詞

        LeetCode刷題實戰(zhàn)473:火柴拼正方形

        LeetCode刷題實戰(zhàn)474:一和零

        LeetCode刷題實戰(zhàn)475:供暖器

        LeetCode刷題實戰(zhàn)476:數(shù)字的補數(shù)


        瀏覽 102
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            美女一级黄色片 | 久久婷婷五月综合色国产婷婷一 | 人人妻人人澡人人爽 | 品久久久久久久久久96高清 | 成人午夜A片免费看 | 四虎成人网 | www.caoporn | 夜里十大b站入口 | 少妇大战28厘米黑人 | 冰漪野外丰满人体1 |