每天一道leetcode-求兩個已經(jīng)排列好的數(shù)組的中值

問題描述

There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

You may assume nums1 and nums2 cannot be both empty.

Example 1:
nums1 = [1, 3]
nums2 = [2]

The median is 2.0
Example 2:

nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

在我的一篇博客中提供了類似的方法找到第K個最小數(shù)
這里提供另外一種想法

想法

把數(shù)組a b 都分為兩個數(shù)組 恩尾,a分為a[0] - a[i-1] , a[i] - a[m-1];b分為b[0] - b[j-1],b[j] - b[n-1];
滿足下列兩個條件

  • i + j = m - i + n - j 也就是 j = (m+n) / 2 - j;
  • 左邊的小于右邊的 也就是a[i-1] < b[j]; b[j-1] < a[i]
    滿足這兩個條件之后,很容易得到兩個數(shù)組得中值 柿隙,也就是如果數(shù)組是奇數(shù)的話垒玲,就是a[i-1],b[j-1]較大的那個纳猫,如果是偶數(shù)恕出,就是兩者相加除以2.

問題就轉換到了如何分成滿足這兩個條件的數(shù)組蔼卡,也就是找到合適的i,也就是找到滿足第二個條件的i

找i方法

找[imin,imax]

  • 如果a[i-1] > b[j]屯伞,就要減少也就是imax = i - 1; 找[imin, i-1]腿箩;
  • 如果a[i] < b[j-1] i要增大 就是找[i+1,imax],也就是imin = i + 1;

代碼

class Solution {
    public double findMedianSortedArrays(int[] A, int[] B) {
        int m = A.length;
        int n = B.length;
        if (m > n) { // to ensure m<=n
            int[] temp = A; A = B; B = temp;
            int tmp = m; m = n; n = tmp;
        }
        int iMin = 0, iMax = m, halfLen = (m + n + 1) / 2;
        while (iMin <= iMax) {
            int i = (iMin + iMax) / 2;
            int j = halfLen - i;
            if (i < iMax && B[j-1] > A[i]){
                iMin = i + 1; // i is too small
            }
            else if (i > iMin && A[i-1] > B[j]) {
                iMax = i - 1; // i is too big
            }
            else { // i is perfect
                int maxLeft = 0;
                if (i == 0) { maxLeft = B[j-1]; }
                else if (j == 0) { maxLeft = A[i-1]; }
                else { maxLeft = Math.max(A[i-1], B[j-1]); }
                if ( (m + n) % 2 == 1 ) { return maxLeft; }

                int minRight = 0;
                if (i == m) { minRight = B[j]; }
                else if (j == n) { minRight = A[i]; }
                else { minRight = Math.min(B[j], A[i]); }

                return (maxLeft + minRight) / 2.0;
            }
        }
        return 0.0;
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(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
  • 正文 為了忘掉前任,我火速辦了婚禮堰塌,結果婚禮上赵刑,老公的妹妹穿的比我還像新娘。我一直安慰自己场刑,他們只是感情好般此,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般铐懊。 火紅的嫁衣襯著肌膚如雪邀桑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天科乎,我揣著相機與錄音壁畸,去河邊找鬼。 笑死喜喂,一個胖子當著我的面吹牛瓤摧,可吹牛的內容都是我干的。 我是一名探鬼主播玉吁,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼照弥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了进副?” 一聲冷哼從身側響起这揣,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎影斑,沒想到半個月后给赞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡矫户,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年片迅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皆辽。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡柑蛇,死狀恐怖,靈堂內的尸體忽然破棺而出驱闷,到底是詐尸還是另有隱情耻台,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布空另,位于F島的核電站盆耽,受9級特大地震影響,放射性物質發(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

推薦閱讀更多精彩內容