leetcode004 (二分查找)尋找兩個正序數(shù)組的中位數(shù)

4. 尋找兩個正序數(shù)組的中位數(shù)

難度困難3569

給定兩個大小為 m 和 n 的正序(從小到大)數(shù)組 nums1nums2开镣。請你找出并返回這兩個正序數(shù)組的中位數(shù)收津。

進階:你能設計一個時間復雜度為 O(log (m+n)) 的算法解決此問題嗎忆某?

示例 1:

輸入:nums1 = [1,3], nums2 = [2]
輸出:2.00000
解釋:合并數(shù)組 = [1,2,3] 碗硬,中位數(shù) 2

示例 2:

輸入:nums1 = [1,2], nums2 = [3,4]
輸出:2.50000
解釋:合并數(shù)組 = [1,2,3,4] 沿癞,中位數(shù) (2 + 3) / 2 = 2.5

示例 3:

輸入:nums1 = [0,0], nums2 = [0,0]
輸出:0.00000

示例 4:

輸入:nums1 = [], nums2 = [1]
輸出:1.00000

示例 5:

輸入:nums1 = [2], nums2 = []
輸出:2.00000

提示:

  • nums1.length == m
  • nums2.length == n
  • 0 <= m <= 1000
  • 0 <= n <= 1000
  • 1 <= m + n <= 2000
  • -10<sup>6</sup> <= nums1[i], nums2[i] <= 10<sup>6</sup>

My solution(歸并法)

import java.util.Arrays;
public class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int[] arr=new int[nums1.length+nums2.length];
        for(int i=0;i<nums1.length;i++)
            arr[i]=nums1[i];
        for (int i =0;i<nums2.length;i++)
            arr[i+nums1.length]=nums2[i];
        Arrays.sort(arr);
        return arr.length%2==1?arr[(arr.length-1)/2]:(arr[arr.length/2]+arr[arr.length/2-1])/2.0;
    }
}

執(zhí)行用時:5 ms, 在所有 Java 提交中擊敗了14.05%的用戶
內存消耗:39.6 MB, 在所有 Java 提交中擊敗了81.65%的用戶

關于Arrays的sort方法,這里有一篇文章詳細介紹了它使用的算法https://www.cnblogs.com/baichunyu/p/11935995.html

我的解法肯定達不到題目要求的時間復雜度O(logn)擅腰,一般出現(xiàn)這樣的對數(shù)時間復雜度叠蝇,都是用到了二分查找法:

二分查找

public class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int n=nums1.length+nums2.length;
        if(n%2==1)//和為奇數(shù),返回第n/2+1個數(shù)
                return getMid(nums1,nums2,n/2+1);
        if(n%2==0)//和為偶數(shù)铸鹰,返回第n/2個數(shù)和第n/2+1個數(shù)的和的一半
                return (getMid(nums1,nums2,n/2)+getMid(nums1,nums2,n/2+1))/2.0;
        else
            return 0;
    }
    public double getMid(int[] nums1, int[] nums2,int k){
        //返回第k個數(shù)
        int start1=0,start2=0;
        while(true){
            if(start1==nums1.length)
                return nums2[start2+k-1];
            if(start2==nums2.length)
                return nums1[start1+k-1];
            if(k==1)
                return Math.min(nums1[start1],nums2[start2]);
           int index1=Math.min(start1+k/2-1,nums1.length-1);
           int index2=Math.min(start2+k/2-1,nums2.length-1);
             if(nums1[index1]<=nums2[index2])
            {
                k-=index1-start1+1;
                start1=index1+1;
            }
            else
            {
                k-=index2-start2+1;
                start2=index2+1;
            }
        }
    }
}

該代碼是leetcode官方二分法解答的簡化版癌别,其主要就是定義了一個函數(shù),運用二分法獲取兩個數(shù)組中從小到大第k個元素

其中start1蹋笼,start2分別代表數(shù)組的起始指針展姐,初始值為0,都指向第一個元素剖毯;

進入循環(huán)后圾笨,首先判斷起始指針是否已經(jīng)到數(shù)組的最后,如果是逊谋,表示其中一個數(shù)組已經(jīng)判斷完了擂达,只需返回剩余數(shù)組的第k個元素即為結果

如果k=1,這時兩個數(shù)組都還沒有判斷完涣狗,這時只需返回剩余數(shù)組的最小元素(第一個)谍婉,即兩個數(shù)組第一個元素的最小值舒憾;

主要部分:
首先獲取接下來需要判斷的index,這個index不能超過數(shù)組的最大值穗熬,所以需要判斷一下镀迂,相應的k也就不能直接寫成k-=k/2,因為判斷完舍去的元素個數(shù)不一定為k/2唤蔗,新的起始指針設為index+1探遵,因為判斷完后,連位置為index的元素也一并舍去了妓柜,所以需要從下一個元素開始判斷

具體的原理可以直接看下面的鏈接

時間復雜度為O(logn)的算法要先考慮二分法箱季,這種方法復雜的地方就在于奇偶判斷這部分,建議畫圖棍掐,舉例解決

作者:LeetCode-Solution
鏈接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xun-zhao-liang-ge-you-xu-shu-zu-de-zhong-wei-s-114/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末藏雏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子作煌,更是在濱河造成了極大的恐慌掘殴,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粟誓,死亡現(xiàn)場離奇詭異奏寨,居然都是意外死亡,警方通過查閱死者的電腦和手機鹰服,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門病瞳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悲酷,你說我怎么就攤上這事套菜。” “怎么了舔涎?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵笼踩,是天一觀的道長。 經(jīng)常有香客問我亡嫌,道長嚎于,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任挟冠,我火速辦了婚禮于购,結果婚禮上,老公的妹妹穿的比我還像新娘知染。我一直安慰自己肋僧,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嫌吠,像睡著了一般止潘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辫诅,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天凭戴,我揣著相機與錄音,去河邊找鬼炕矮。 笑死么夫,一個胖子當著我的面吹牛,可吹牛的內容都是我干的肤视。 我是一名探鬼主播档痪,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼邢滑!你這毒婦竟也來了腐螟?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤困后,失蹤者是張志新(化名)和其女友劉穎遭垛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體操灿,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年泵督,在試婚紗的時候發(fā)現(xiàn)自己被綠了趾盐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡小腊,死狀恐怖救鲤,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情秩冈,我是刑警寧澤本缠,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站入问,受9級特大地震影響丹锹,放射性物質發(fā)生泄漏。R本人自食惡果不足惜芬失,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一楣黍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棱烂,春花似錦租漂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秃踩。三九已至,卻和暖如春业筏,著一層夾襖步出監(jiān)牢的瞬間憔杨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工驾孔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芍秆,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓翠勉,卻偏偏與公主長得像妖啥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子对碌,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容