Leetcode - Median of Two Sorted Arrays

**
Question:

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)).

**

My code:

public class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        if (nums1 == null || nums2 == null)
            return 0;
        if (nums1.length == 0 && nums2.length == 0)
            return 0;
        int m = nums1.length;
        int n = nums2.length;
        if (m == 0)
            if (n % 2 == 1)
                return nums2[n / 2];
            else
                return ((double)nums2[n / 2] + (double)nums2[n / 2 - 1]) / 2.0;
        else if (n == 0)
            if (m % 2 == 1)
                return nums1[m / 2];
            else
                return ((double)nums1[m / 2] + (double)nums1[m / 2 - 1]) / 2.0;
        
        
        int indexOfNums1 = 0;
        int indexOfNums2 = 0;
        boolean isOutOfRange = false;
        int[] mergeArray = new int[m + n];
        for (int i = 0; i < m + n; i++) {
            
            if (indexOfNums1 < m && (nums1[indexOfNums1] < nums2[indexOfNums2] || isOutOfRange)) {
                mergeArray[i] = nums1[indexOfNums1];
                indexOfNums1++;
            }
            else {
                mergeArray[i] = nums2[indexOfNums2];
                if (indexOfNums2 < n - 1)
                    indexOfNums2++;
                else
                    isOutOfRange = true;
            }
        }
        
        if ((m + n) % 2 == 1)
            return mergeArray[(m + n) / 2];
        else
            return ((double)mergeArray[(m + n) / 2] + (double)mergeArray[(m + n) / 2 - 1]) / 2.0;
        
    }
    
    public static void main(String[] args) {
        Solution test = new Solution();
        int[] a = {100001};
        int[] b = {100000};
        System.out.println(test.findMedianSortedArrays(a, b));
    }
}

My test result:

Paste_Image.png

這次的難度是hard,但是我一看到就有了思路蛹疯,然后花了十分鐘寫了出來。
這不就是歸并排序(Merge Sort)的簡(jiǎn)單版本么固翰。骂际。冈欢。
給兩個(gè)已排序好的數(shù)列,然后將它們合并太示,獲得一個(gè)新的數(shù)列
來香浩,復(fù)習(xí)下歸并排序。
我自己創(chuàng)造的一個(gè)圖書餐弱。
. . . . . . . . 一個(gè)array囱晴,用歸并排序來處理
. . . . | . . . . 分成兩個(gè)array,分別進(jìn)行歸并排序
. . | . . | . . | . . 對(duì)于每個(gè)子array,再次分成兩個(gè)array驮瞧,分別進(jìn)行歸并排序论笔。
此時(shí)每個(gè)部分只有兩個(gè)數(shù)字了, lo指向第一個(gè)狂魔,頭。hi指向最后一個(gè)理茎,也是第二個(gè)管嬉,尾。
于是進(jìn)行簡(jiǎn)單的排序础倍。完成了胎挎。退回到上步。
. . | . . | . . | . . 此時(shí)的子array都是已經(jīng)排序好了的德迹。于是將 1,2子array歸并揭芍,3,4子array歸并称杨。
. . . . | . . . . 此時(shí)的兩個(gè)子array也是已經(jīng)排序好了的。于是將它們歸并悬而,得到最后的排序結(jié)果锭汛。
. . . . . . . .

然后歸并排序的核心就是這次作業(yè)寫的椰憋。
兩個(gè)array,然后我先創(chuàng)建一個(gè)array長(zhǎng)度是他們的長(zhǎng)度和。
然后通過移動(dòng)指針左电,將兩個(gè)數(shù)組對(duì)應(yīng)位置較小的拷貝進(jìn)入mergeArray页响,然后指針再往前一格闰蚕。這樣连舍,掃描(m + n)次就能完成了。
然后處理一些數(shù)組越界問題盼玄。就差不多潜腻。復(fù)雜度是 N * Log(N)

**
總結(jié):
歸并排序。
數(shù)組越界融涣。
**

最近兩次作業(yè)都是十幾分鐘寫出來了。剃斧。忽你。是我太強(qiáng)了嗎?
我不覺得筋粗。我覺得是評(píng)測(cè)系統(tǒng)有問題炸渡。這兩道題目正常人應(yīng)該都半小時(shí)內(nèi)就能做出來吧。
最近聽了荔枝FM的一個(gè)廣播买决。額吼畏,首先聲明,我絕對(duì)不是做廣告的人躲舌。
很感動(dòng)没卸。然后那么一句話。
**
其實(shí)我也是一個(gè)普通人啊约计。
**
打到我內(nèi)心了。
小說世界里耕挨, 泰廣尉桩,米可,最后能破鏡重圓赋铝。
現(xiàn)實(shí)世界里沽瘦,會(huì)有這般失而復(fù)得的事嗎?
所以良哲,確定你想要的助隧,然后堅(jiān)持下去。
讀者們肯定看不懂我說的這些話巍实,但你呢棚潦,應(yīng)該看得懂吧膝昆。
我愿意為你改變很多,放棄很多妹窖。
你也愿意為我忍耐很多收叶,擔(dān)心很多。
異地異國(guó)實(shí)在是太難熬谒麦,但熬出頭了呢哆致。
如果因?yàn)槟敲匆患氖拢蹅冏罱K放棄耻蛇。不知道你會(huì)怎么想胞此。
我的話,一定會(huì)有新的女朋友夺蛇,家庭酣胀。
但這份對(duì)你的遺憾,會(huì)陪伴我甚脉,直到進(jìn)入棺材牺氨。

Anyway, Good luck, Richardo!

My code:

public class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        if (nums1 == null || nums2 == null) {
            return -1;
        }
        else if (nums2.length < nums1.length) {
            return findMedianSortedArrays(nums2, nums1);
        }
        else if (nums2.length == 0) {
            return -1;
        }
        
        
        int m = nums1.length;
        int n = nums2.length;
        
        int half = (m + n + 1) / 2;
        int imin = 0;
        int imax = m;
        while (imin <= imax) {
            int i = (imax + imin) / 2;
            int j = half - i;
            if (i - 1 >= 0 && j < n && nums1[i - 1] > nums2[j]) {
                imax = i - 1;
            }
            else if (j - 1 >= 0 && i < m && nums2[j - 1] > nums1[i]) {
                imin = i + 1;
            }
            else {
                int left = 0;
                if (i == 0) {
                    left = nums2[j - 1];
                }
                else if (j == 0) {
                    left = nums1[i - 1];
                }
                else {
                    left = Math.max(nums1[i - 1], nums2[j - 1]);
                }
                
                if ((m + n) % 2 == 1) {
                    return left;
                }
                
                int right = 0;
                if (i == m) {
                    right = nums2[j];
                }
                else if (j == n) {
                    right = nums1[i];
                }
                else {
                    right = Math.min(nums1[i], nums2[j]);
                }
                
                return (left + right) / 2.0;
            }
        }
        return -1;
    }
    
    public static void main(String[] args) {
        Solution test = new Solution();
        int[] nums1 = new int[]{1,2};
        int[] nums2 = new int[]{3,4,5,6};
        double ret = test.findMedianSortedArrays(nums1, nums2);
        System.out.println(ret);
    }
}

reference:
https://discuss.leetcode.com/topic/4996/share-my-o-log-min-m-n-solution-with-explanation/2

這道題目實(shí)在是太惡心了猴凹。弄了一個(gè)多小時(shí)精堕。
corner case 太多了蒲障。。庄撮。

看下講解毙籽,思路清晰了很多。但是還是調(diào)了很久很久烙如。
最大的問題是,得把短的作為切割的第一數(shù)組蝇刀,即徘溢, i

因?yàn)槿绻虚L(zhǎng)的,作為i
那么 j很有可能變成負(fù)數(shù)站粟,會(huì)出現(xiàn)錯(cuò)誤曾雕。
如果切短的,就不會(huì)用這個(gè)問題切诀。

還有個(gè)注意的地方就是:
half = (m + n + 1) / 2;
這樣保證趾牧,如果 m + n 是偶數(shù),
那么左右部分個(gè)數(shù)相等翘单。
如果是奇數(shù)哄芜,那么左邊會(huì)多一個(gè)柬唯。

而且imax = m 而不是 m - 1,真的求中點(diǎn)锄奢。
如果m是奇數(shù)拘央,就是正中點(diǎn)。如果m是偶數(shù)灰伟,是中間兩個(gè)數(shù)右邊那個(gè)。
這些正好都是我們需要的特性栈源。

實(shí)在是太惡心了竖般。

加油!

Anyway, Good luck, Richardo! -- 09/01/2016

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末制轰,一起剝皮案震驚了整個(gè)濱河市胞谭,隨后出現(xiàn)的幾起案子男杈,更是在濱河造成了極大的恐慌丈屹,老刑警劉巖旺垒,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件先蒋,死亡現(xiàn)場(chǎng)離奇詭異宛渐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)业岁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門笔时,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仗岸,“玉大人,你說我怎么就攤上這事较锡∫” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵谦纱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我跨嘉,道長(zhǎng)吃嘿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任亮瓷,我火速辦了婚禮嘱支,結(jié)果婚禮上挣饥,老公的妹妹穿的比我還像新娘。我一直安慰自己汛聚,他們只是感情好短荐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布搓侄。 她就那樣靜靜地躺著,像睡著了一般讶踪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柱查,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天唉工,我揣著相機(jī)與錄音汹忠,去河邊找鬼雹熬。 笑死谣膳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的烈菌。 我是一名探鬼主播花履,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼诡壁,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了葬荷?” 一聲冷哼從身側(cè)響起纽帖,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤举反,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后室囊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體魁索,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粗蔚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了致扯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片当辐。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缘揪,死狀恐怖义桂,靈堂內(nèi)的尸體忽然破棺而出蹈垢,到底是詐尸還是另有隱情,我是刑警寧澤罢浇,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布沐祷,位于F島的核電站,受9級(jí)特大地震影響胞锰,放射性物質(zhì)發(fā)生泄漏兢榨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一凌那、第九天 我趴在偏房一處隱蔽的房頂上張望吟逝。 院中可真熱鬧,春花似錦块攒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至料祠,卻和暖如春澎羞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妆绞。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留株茶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓蹦掐,卻偏偏與公主長(zhǎng)得像僵闯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鳖粟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)向图。 張土汪:刷leetcod...
    土汪閱讀 12,745評(píng)論 0 33
  • 最近十分緊張的工作狀態(tài)已持續(xù)了將近一個(gè)月,家人和朋友都很關(guān)心我這段時(shí)期的狀態(tài)榄攀,在這第25天第一次得以抽身休息的日子...
    Maggie_竹子閱讀 771評(píng)論 2 2
  • (以后叫你李大哥吧)遇到躲不掉的脾氣,我翻過白眼磺陡,頂過嘴漠畜,說過氣話坞靶,可是一點(diǎn)用也沒有,反而越來越怕彰阴。后來我發(fā)現(xiàn),再...
    future_fan閱讀 203評(píng)論 1 0
  • 女人在愛情里最容易犯的錯(cuò) 作者:Rachel君 [為保護(hù)當(dāng)事人隱私簇抵,文中均為化名] 老師你好射众,我和男友都是89年的...
    Rachel君閱讀 590評(píng)論 0 5
  • 為自己的臨終做準(zhǔn)備叨橱,我相信60歲以下的中國(guó)人断盛,90%以上的人不會(huì)思考這個(gè)問題愉舔,甚至回避這個(gè)話題。 曾經(jīng)我也害怕面對(duì)...
    夏花de解憂雜貨鋪閱讀 1,986評(píng)論 8 28