sponsored links

每日刷題|尋找兩個正序陣列的中位數

題目如下:

每日刷題|尋找兩個正序陣列的中位數


題目描述

這題其實很容易想到的思路是,將兩個數組合併成一個,再取合併後陣列的中位數,程式碼如下:

class Solution {

    // O(m+n)
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int len1 = nums1.length, len2 = nums2.length, len3 = len1 + len2;
        int[] nums3 = new int[len3];
        int point1 = 0, point2 = 0;
        for (int i = 0; i < len3; i++) {
            if (point1 == len1) {
                // nums1遍歷完了,把nums2剩下的直接放進來
                if (point2 < len2) {
                    nums3[i] = nums2[point2++];
                    continue;
                }
            }
            if (point2 == len2) {
                // nums2遍歷完了,把nums1剩下的直接放進來
                if (point1 < len1) {
                    nums3[i] = nums1[point1++];
                    continue;
                }
            }

            if (nums1[point1] < nums2[point2]) {
                nums3[i] = nums1[point1++];
            } else {
                nums3[i] = nums2[point2++];
            }

        }
        // 取中位數
        return (nums3[(len3 - 1) / 2] + nums3[len3 / 2]) / 2d;
    }
}

很容易就完成了,但是時間複雜度是O(m+n),而且還增加了一個數組的空間,不能滿足題目的要求。題目需要達到O(log(m+n)),那麼就需要用二分法了。

這裡備註一下為什麼二分法的時間複雜度是O(log n),在n個元素中查詢一個數,其剩餘元素的個數依次是n/2¹,n/2²,n/2³···n/2ⁱ,如果第一次就找到了,則時間複雜度為O(1),如果最後剩一個元素的時候才找到,n/2ⁱ=1,i=log n,O(log n)就是這麼來的。

下面來進行二分法,對兩個陣列中較小的一個數組二分,時間複雜度可以降到O(log min(m,n)),具體思路是在nums1中找到合適的位置,對nums1和nums2進行切分:

每日刷題|尋找兩個正序陣列的中位數

每日刷題|尋找兩個正序陣列的中位數

每日刷題|尋找兩個正序陣列的中位數

需要達到的效果可以看程式碼中的註釋,主要是要想到這個思路比較複雜,花了很長時間理解。

class Solution {
    // O(log min(m,n))
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        // 保持nums1元素較少
        if (nums1.length > nums2.length) {
            int[] temp = nums1;
            nums1 = nums2;
            nums2 = temp;
        }
        int len1 = nums1.length, len2 = nums2.length;
        // 劃中分線的時候,算出左邊元素的個數
        // 如果是奇數,讓左邊多一個;如果是偶數,兩邊一樣多
        // 比如總數5個和6個,左邊都是3個
        int leftCount = (len1 + len2 + 1) / 2;
        int l = 0, r = len1;
        //
        // 核心程式碼在這個迴圈中,對nums1進行二分,左右調整位置找到最後一個小於num2的零界點
        while (l < r) {
            int nums1LeftCount = (l + r + 1) / 2;
            int nums2LeftCount = leftCount - nums1LeftCount;
            if (nums1[nums1LeftCount - 1] <= nums2[nums2LeftCount]) {
                // 下一次二分的陣列為nums1的nums1LeftCount~r之間
                l = nums1LeftCount;
            }else {
                // 下一次二分的陣列為nums1的l~nums1LeftCount-1之間
                r = nums1LeftCount - 1;
            }
        }
        int nums1LeftCount = l;
        int nums2LeftCount = leftCount - nums1LeftCount;
        int maxLeft, minRight;
        // maxLeft一定有
        if (nums1LeftCount == 0) {
            maxLeft = nums2[nums2LeftCount - 1];
        } else if (nums2LeftCount == 0) {
            maxLeft = nums1[nums1LeftCount - 1];
        } else {
            maxLeft = Math.max(nums1[nums1LeftCount - 1], nums2[nums2LeftCount - 1]);
        }
        // 總數為偶數的時候,中位數為(左邊最大+右邊最小)/2
        // 總數為奇數的時候,中位數為左邊最大
        if ((len1 + len2) % 2 != 0) {
            return maxLeft;
        } else {
            // minRight不一定有,在總數為偶數的時候minRight則一定有,這個時候再算minRight
            if (nums1LeftCount == len1) {
                minRight = nums2[nums2LeftCount];
            } else if (nums2LeftCount == len2) {
                minRight = nums1[nums1LeftCount];
            } else {
                minRight = Math.min(nums1[nums1LeftCount], nums2[nums2LeftCount]);
            }
            return (maxLeft + minRight) / 2d;
        }
    }
}

每日刷題|尋找兩個正序陣列的中位數


執行結果

奶思~

分類: 娛樂
時間: 2022-01-08

相關文章

董璇女兒和外婆現身機場,小酒窩開心蹦躂超活潑,外婆時髦氣質佳

董璇女兒和外婆現身機場,小酒窩開心蹦躂超活潑,外婆時髦氣質佳
其實娛樂圈大部分明星媽媽還都是非常顧家的,不工作的時候往往都和孩子在一起.董璇就經常帶女兒現身機場,時刻把小酒窩帶在身邊,是個有責任心的好母親. 9月16日,粉絲團再次曝光了小酒窩現身機場的照片,不過 ...

參加angelababy楊穎和黃曉明婚禮,五對戀人或夫妻已經走散四對

參加angelababy楊穎和黃曉明婚禮,五對戀人或夫妻已經走散四對
參加angelababy楊穎和黃曉明婚禮的五對戀人或夫妻已經走散四對. 王寶強馬蓉 賈乃亮李小璐已經離婚,鄭愷 張靚穎分別與前任劃清界線,還鬧得非常難堪.只有包貝爾和包文婧的婚姻還好好的. 娛樂圈總是 ...

22歲小彩旗現身機場,身材臃腫打扮清奇,叛逆後的她事業毫無進展

22歲小彩旗現身機場,身材臃腫打扮清奇,叛逆後的她事業毫無進展
小彩旗現身機場似路人,身材臃腫穿著異類,如今的她事業毫無進展 娛樂圈的明星總是"東昇西落"的,之前小彩旗登上了春晚的舞臺,並且讓觀眾們印象深刻,在那之後她就走紅了.但是這種紅只能說 ...

劉愷威魏大勳現身機場上演“世紀同框”,全程無交流,氣氛尷尬

劉愷威魏大勳現身機場上演“世紀同框”,全程無交流,氣氛尷尬
活久見!9月20日,劉愷威和魏大勳被拍到同時現身機場的同框照,真實上演了一出"世紀同框"的畫面,令網友大呼"緣,妙不可言!" 兩位藝人都是頭戴黑色鴨舌帽,戴著口 ...

範丞丞現身機場低頭快走 身著白T藍短襯衫帥氣有型

範丞丞現身機場低頭快走 身著白T藍短襯衫帥氣有型
9月18日,北京,範丞丞現身機場低頭快走,身著白T藍短襯衫帥氣有型.

Angelababy楊穎┃一襲紅裙,明豔動人……

Angelababy楊穎┃一襲紅裙,明豔動人……
#娛樂聚焦# 童話的神秘碰撞紅色的浪漫,少女的夢幻碰撞女王的優雅--第十一屆北京國際電影節開幕紅毯上,Angelababy楊穎身著一襲紅心禮服驚豔亮相.這件禮服師內地首次亮相的Dior 2021秋冬系 ...

楊穎現身山東錄製跑男,拼色外套搭配牛仔褲,休閒氣質惹人圍觀

楊穎現身山東錄製跑男,拼色外套搭配牛仔褲,休閒氣質惹人圍觀
Hi,這裡是搭搭, 一個專注穿衣打扮,專屬你美麗的時尚達人! 最開始認識楊穎就是因為綜藝節目奔跑吧兄弟,開播第一季時很多人並不看好,當真正火起來的時候,卻成為了一種現象級,並帶火了一大批類似的綜藝. ...

包文婧攜女兒現身機場被拍,6歲餃子坐行李車萌態十足,對鏡大方微笑超自信
10月8日,34歲演員包文婧攜6歲女兒餃子(大名:包可艾)現身機場被拍,因照片中母女兩人顏值超高,引發眾多網友關注. 照片中,包文婧身穿黑色上衣搭配同色系休閒褲,肩上裹著一條白色披肩,簡約中透露著一絲 ...

李小璐甜馨母女現身機場,女兒顏值趕超媽媽,對鏡頭扮鬼臉賣萌

李小璐甜馨母女現身機場,女兒顏值趕超媽媽,對鏡頭扮鬼臉賣萌
2021年10月8日,李小璐和女兒甜馨現身機場,女兒顏值趕超媽媽,對鏡頭扮鬼臉賣萌.

文詠珊穿卡其色衛衣現身機場,演繹大寫的休閒時髦感,舒適好穿搭

文詠珊穿卡其色衛衣現身機場,演繹大寫的休閒時髦感,舒適好穿搭
最近,文詠珊穿卡其色衛衣套裝現身機場,演繹大寫的休閒時髦感, Celine毛線帽的加入,更顯時髦與溫柔,這樣的穿搭看起來好舒適,喜歡喜歡,真喜歡! 卡其色衛衣套裝 衛衣套裝,在秋天裡面出鏡率蠻高的,因 ...

43歲曾黎現身機場,紅色大衣+闊腿褲好減齡,說她只有23歲我都信
俗語說"光陰是把殺豬刀",但這把刀宛若對美女也是分外部下包涵,曾被譽為中戲200年一遇的美女曾黎,當今也是奔四的人了,但她自己的現實狀況和年紀實在的不符合.在非常新的機場look中 ...

劉愷威戴綠色口罩現身機場,跟魏大勳巧妙相遇,兩人同框疑無交流

劉愷威戴綠色口罩現身機場,跟魏大勳巧妙相遇,兩人同框疑無交流
9月20號,劉愷威現身北京機場,只見劉愷威戴著黑色棒球帽跟綠色口罩,口罩顏色在人群當中特別搶眼,看起來很新潮了. 劉愷威打扮得也很時尚,黑色T恤外搭夾克衫,很顯年輕,劉愷威雖說已經40多歲了,但是狀態 ...

重要時刻,現身機場的上將是誰?

重要時刻,現身機場的上將是誰?
撰文 | 董鑫 孟亞旭 "總指揮長同志,神舟十二號飛行乘組任務已完成,向您報告!" 2021年9月17日,圓滿完成神舟十二號載人飛行任務的航天員聶海勝.劉伯明.湯洪波,乘坐任務飛機 ...

林峰夫婦現身機場,十指緊扣秀恩愛,張馨月手拎3萬“菜籃”搶鏡

林峰夫婦現身機場,十指緊扣秀恩愛,張馨月手拎3萬“菜籃”搶鏡
9月18日,林峰和張馨月夫婦被拍到現身上海機場. 當天他們兩人打扮得很登對,張馨月穿著灰色格紋西裝搭配黑色短褲,腳踩球鞋青春靚麗,林峰則穿著灰色T恤搭配黑色印花短褲,和張馨月雖然不是同款,但整體色調統 ...

Angelababy楊穎穿一襲紅心禮服裙亮相北影節開幕紅毯,明豔動人

Angelababy楊穎穿一襲紅心禮服裙亮相北影節開幕紅毯,明豔動人
#Angelababy紅心禮服裙#亮相電影節紅毯,一襲Dior紅色薄紗禮服,愛心元素為造型增添浪漫,超美的 Baby 氛圍感絕了-#angelababy# 你們覺得baby這身打扮美嗎?

33歲王麗坤現身機場,僅僅是穿了件黑色波點裙,一下就老了十歲

33歲王麗坤現身機場,僅僅是穿了件黑色波點裙,一下就老了十歲
自出道以來,王麗坤即是以清爽脫俗的氣質迷惑浩繁眼球,影視小花的名稱也是名副其實的,在前衛穿搭上,也有本人的年頭,這也是在文娛圈獲取不小造詣的緊張成分之一吧! 王麗坤的愛情也是讓一大波粉絲們操碎了心,和 ...

霍汶希真的美出圈,穿綠夾克配牛仔褲走機場,顏值氣質媲美大明星

霍汶希真的美出圈,穿綠夾克配牛仔褲走機場,顏值氣質媲美大明星
霍汶希的名字大家都非常熟悉,作為娛樂圈的金牌推手,很多一線大牌藝人都是她一手捧紅的,她除了有著精明的頭腦之外,也有著不輸女明星的顏值和衣品,穿綠色夾克衫搭配牛仔褲,一身休閒裝穿出時髦感. 霍汶希的造型 ...

北影節紅毯:楊穎美背搶鏡,佟麗婭仙氣絕美,都不及鞏俐比耶吸睛

北影節紅毯:楊穎美背搶鏡,佟麗婭仙氣絕美,都不及鞏俐比耶吸睛
北影節紅毯,亮了. 眾所周知,紅毯,從來是女星的戰場.這些年,某冰消失後,內娛女星征戰紅毯好幾輪,似乎都還沒找到一個紅毯上的絕對王者. 但這場大型爭奇鬥豔比賽,終究會有人殺出重圍,成為全場的聚光燈,集 ...

北影節紅毯造型:鞏俐霸氣,佟麗婭美豔如天鵝,baby紅裙最搶鏡

北影節紅毯造型:鞏俐霸氣,佟麗婭美豔如天鵝,baby紅裙最搶鏡
北影節紅毯造型:鞏俐霸氣,佟麗婭美豔如天鵝,baby紅裙最搶鏡!9月20日,第11屆北京國際電影節開幕式開啟,參加的女明星也很多,現場來看,參加的有鞏俐.周冬雨.徐帆.張歆藝.佟麗婭.楊穎.張婧儀等等 ...