4. Median of Two Sorted Arrays

最簡單的方法是兩個數(shù)組一個一個往前找找到中間那個數(shù)結(jié)束。但是時間復雜度是O(m+n)抓艳。既然要求復雜度為O(log(m+n)),所以幾乎一定是二分查找玷或。而且應該也不用一個挨著一個找。

許多corner case干擾推導:

  1. m + n是奇數(shù)還是偶數(shù)偏友?奇數(shù)的話要取第(m+n)/2 + 1個數(shù)。偶數(shù)的話要取第(m+n)/2個和第(m+n)/2 + 1個數(shù)的平均數(shù)位他?解決方法是設置helper函數(shù),題目本質(zhì)為:取兩個數(shù)組的第k大的數(shù)鹅髓。所以判斷先判斷奇偶,偶的話返回兩個helper結(jié)果的平均數(shù)窿冯。
  2. m和n誰大?應該一直假設m比n大醒串,如果不是的話执桌,helper兩個數(shù)組反過來厦凤。
  3. 開始二分法,兩邊都取第k/2個數(shù)(實際編碼時候index=[k/2] -1)
    a. 如果m(k/2) < n(k/2)较鼓, 那m這邊0~k/2都在前k個里面,換言之博烂,中位數(shù)(第k個大的數(shù))肯定不在這里面。(為什么禽篱?反證法,如果中文數(shù)在m的前k/2里面躺率,那m這邊最多k/2 - 1個數(shù),n那邊第k/2個比m這邊第k/2個大悼吱,所以肯定也不是中位數(shù),所以也是最多k/2 - 1個數(shù)后添,最后加一塊兒k-2個數(shù),少于k個數(shù)遇西。
    所以要把m這邊的前k/2個都算進去,然后繼續(xù)找m后一半和n的全部粱檀,找第k - k/2 = k/2個數(shù)
    b. 如果m(k/2) = n(k/2),那如果k為奇數(shù)茄蚯,就是這個數(shù)后面那個m和n里面比較小的數(shù)。如果k為偶數(shù)第队,就是這倆數(shù)。
  4. 特殊情況
    a. 最后越來越少不夠k/2: 所以要取pa = min(k/2, m),另一邊 pb = k - pa而不是簡單的兩邊都是k/2
    b. k = 1時上面算法不需要凳谦,也是停止點, 否則pa = 0, pb = 1, 數(shù)組index = pa -1是非法值。
public class Solution {
    public double FindMedianSortedArrays(int[] nums1, int[] nums2) {
        int m = nums1.Length;
        int n = nums2.Length;
        if((m + n) % 2 == 1){
            return (double)FindKthLargest(nums1, m, nums2, n, (m + n) / 2 + 1);
        }
        return (FindKthLargest(nums1, m, nums2, n, (m + n) / 2) + FindKthLargest(nums1, m, nums2, n, (m + n) / 2 + 1)) / 2;
    }
    public double FindKthLargest(int[] a, int m, int[] b, int n, int k){
        if(m > n){
            return FindKthLargest(b, n, a, m, k);
        }
        if(m == 0){
            return b[k - 1];
        }
        if(k == 1){
            return Math.Min(a[0], b[0]);
        }
        //Divide k into two parts
        int pa = Math.Min(m, k / 2);
        int pb = k - pa;
        if(a[pa - 1] < b[pb - 1]){
            int[] subArray = new int[m - pa];
            Array.Copy(a, pa, subArray, 0, m- pa);
            return FindKthLargest(subArray, m - pa, b, n, k - pa);
        }
        else if (a[pa - 1] > b[pb - 1]){
            int[] subArray = new int[n - pb];
            Array.Copy(b, pb, subArray, 0, n - pb);
            return FindKthLargest(a, m , subArray, n - pb, k - pb);
        }
        return a[pa - 1];
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缓醋,一起剝皮案震驚了整個濱河市绊诲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掂之,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件世舰,死亡現(xiàn)場離奇詭異,居然都是意外死亡跟压,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門茸塞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人查剖,你說我怎么就攤上這事」=粒” “怎么了效览?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長丐枉。 經(jīng)常有香客問我,道長瘦锹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任弯院,我火速辦了婚禮,結(jié)果婚禮上听绳,老公的妹妹穿的比我還像新娘。我一直安慰自己椅挣,他們只是感情好塔拳,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布峡竣。 她就那樣靜靜地躺著,像睡著了一般适掰。 火紅的嫁衣襯著肌膚如雪颂碧。 梳的紋絲不亂的頭發(fā)上攻谁,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音个曙,去河邊找鬼。 笑死受楼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的艳汽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼米绕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了馋艺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤碱鳞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后踱蛀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡崩泡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了角撞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡靴寂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出百炬,到底是詐尸還是另有隱情,我是刑警寧澤剖踊,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站德澈,受9級特大地震影響歇攻,放射性物質(zhì)發(fā)生泄漏梆造。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一镇辉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忽肛,春花似錦、人聲如沸屹逛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至手销,卻和暖如春歇僧,著一層夾襖步出監(jiān)牢的瞬間锋拖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工兽埃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柄错。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像售貌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子颂跨,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容