LeetCode題解4:Median of Two Sorted Arrays

Median of Two Sorted Arrays問題:求2個有序數(shù)組的中位數(shù)昔搂,要求算法時間復(fù)雜度為O(log(m+n))鹊杖。

難度:困難

思路:此題為“在2個有序數(shù)組中尋找第k個元素”問題的變體蓄坏。根據(jù)中位數(shù)的定義薄辅,此題可轉(zhuǎn)化為“在2個有序數(shù)組中尋找第‘(m+n)/2’個元素”。算法難點在于要求時間復(fù)雜度為O(log(m+n)),因此需要充分利用2個數(shù)組有序這一條件,每次循環(huán)將搜索空間縮小一半。

陷阱:數(shù)組下標(biāo)計算绅络。另外由于LeetCode網(wǎng)站測試用例設(shè)置問題,線性時間復(fù)雜度的算法也可能被接受嘁字。

代碼:

class Solution:
    # @param {integer[]} nums1
    # @param {integer[]} nums2
    # @return {float}
    def find(self, nums1, nums2, k):
        if not nums1:
            return nums2[k]
        if not nums2:
            return nums1[k]
        ia, ib = len(nums1) // 2 , len(nums2) // 2
        ma, mb = nums1[ia], nums2[ib]
        if ia + ib < k:
            if ma > mb:
                return self.find(nums1, nums2[ib + 1:], k - ib - 1)
            else:
                return self.find(nums1[ia + 1:], nums2, k - ia - 1)
        else:
            if ma > mb:
                return self.find(nums1[:ia], nums2, k)
            else:
                return self.find(nums1, nums2[:ib], k)

    def findMedianSortedArrays(self, nums1, nums2):
        l = len(nums1) + len(nums2)
        if l % 2 == 1:
            return self.find(nums1, nums2, l // 2)
        else:
            return (self.find(nums1, nums2, l // 2) + self.find(nums1, nums2, l // 2 - 1)) / 2.0

另外恩急,有人指出Python數(shù)組分片操作本身具有線性時間復(fù)雜度,因此嚴(yán)格地說上述算法不具備O(log(m+n))的時間復(fù)雜度纪蜒。改進方法是將數(shù)組起止下標(biāo)作為變量傳給find函數(shù)衷恭,代碼如下:

class Solution:
    # @param {integer[]} nums1
    # @param {integer[]} nums2
    # @return {float}
    def find(self, nums1, s1, e1, nums2, s2, e2, k):
        if e1 - s1 < 0:
            return nums2[k + s2]
        if e2 - s2 < 0:
            return nums1[k + s1]
        if k < 1:
            return min(nums1[k + s1], nums2[k + s2])
        ia, ib = (s1 + e1) // 2 , (s2 + e2) // 2
        ma, mb = nums1[ia], nums2[ib]
        if (ia - s1) + (ib - s2) < k:
            if ma > mb:
                return self.find(nums1, s1, e1, nums2, ib + 1, e2, k - (ib - s2) - 1)
            else:
                return self.find(nums1, ia + 1, e1, nums2, s2, e2, k - (ia - s1) - 1)
        else:
            if ma > mb:
                return self.find(nums1, s1, ia - 1, nums2, s2, e2, k)
            else:
                return self.find(nums1, s1, e1, nums2, s2, ib - 1, k)

    def findMedianSortedArrays(self, nums1, nums2):
        l = len(nums1) + len(nums2)
        if l % 2 == 1:
            return self.find(nums1, 0, len(nums1) - 1, nums2, 0, len(nums2) - 1, l // 2)
        else:
            return (self.find(nums1, 0, len(nums1) - 1, nums2, 0, len(nums2) - 1, l // 2) + self.find(nums1, 0, len(nums1) - 1, nums2, 0, len(nums2) - 1, l // 2 - 1)) / 2.0

附:線性時間復(fù)雜度算法代碼:

class Solution:
    # @param {integer[]} nums1
    # @param {integer[]} nums2
    # @return {float}
    def findMedianSortedArrays(self, nums1, nums2):
        mid = (len(nums1) + len(nums2) >> 1) + 1
        i = j = 0
        median = n = None
        for k in xrange(mid):
            v1 = nums1[i] if i < len(nums1) else None
            v2 = nums2[j] if j < len(nums2) else None
            n = median
            if v2 is None or (v1 is not None and v1 < v2):
                median = v1
                i += 1
            else:
                median = v2
                j += 1
        if (len(nums1) + len(nums2)) % 2 == 0 and n is not None:
            return (median + n) / 2.0
        return median
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纯续,隨后出現(xiàn)的幾起案子随珠,更是在濱河造成了極大的恐慌,老刑警劉巖猬错,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窗看,死亡現(xiàn)場離奇詭異,居然都是意外死亡倦炒,警方通過查閱死者的電腦和手機显沈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逢唤,“玉大人构罗,你說我怎么就攤上這事≈遣#” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵芙代,是天一觀的道長吊奢。 經(jīng)常有香客問我,道長纹烹,這世上最難降的妖魔是什么页滚? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮铺呵,結(jié)果婚禮上裹驰,老公的妹妹穿的比我還像新娘。我一直安慰自己片挂,他們只是感情好幻林,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布贞盯。 她就那樣靜靜地躺著,像睡著了一般沪饺。 火紅的嫁衣襯著肌膚如雪躏敢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天整葡,我揣著相機與錄音件余,去河邊找鬼。 笑死遭居,一個胖子當(dāng)著我的面吹牛啼器,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播俱萍,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼端壳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鼠次?” 一聲冷哼從身側(cè)響起更哄,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腥寇,沒想到半個月后成翩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡赦役,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年麻敌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掂摔。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡术羔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乙漓,到底是詐尸還是另有隱情级历,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布叭披,位于F島的核電站寥殖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涩蜘。R本人自食惡果不足惜嚼贡,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望同诫。 院中可真熱鬧粤策,春花似錦、人聲如沸误窖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至熊户,卻和暖如春萍膛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嚷堡。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工蝗罗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝌戒。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓串塑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親北苟。 傳聞我的和親對象是個殘疾皇子桩匪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

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

  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,258評論 0 2
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序友鼻,而外部排序是因排序的數(shù)據(jù)很大傻昙,一次不能容納全部...
    蟻前閱讀 5,186評論 0 52
  • 本文分析冒泡、選擇彩扔、插入妆档、希爾、快速虫碉、歸并和堆排序贾惦,為不影響閱讀體驗,將關(guān)于時間敦捧、空間復(fù)雜度和穩(wěn)定性的概念放在博文...
    DeppWang閱讀 427評論 0 2
  • [Chinese ver] 4. Median of Two Sorted Arrays 這里有兩個有序數(shù)組num...
    陳林峰LeonChen1024閱讀 397評論 0 0
  • 持鏡,隨風(fēng) 你是黑暗中的白色
    阿拉斯加海灣0閱讀 238評論 6 2