【每日一題】尋找兩個正序數組的中位數

4. 尋找兩個正序數組的中位數

給定兩個大小分別爲 mn 的正序(從小到大)數組 nums1 和 nums2。請你找出並返回這兩個正序數組的 中位數

算法的時間複雜度應該爲 O(log (m+n))

示例 1:

輸入:nums1 = [1,3], nums2 = [2]
輸出:2.00000
解釋:合併數組 = [1,2,3] ,中位數 2

示例 2:

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

提示:

  • nums1.length == m
  • nums2.length == n
  • 0 <= m <= 1000
  • 0 <= n <= 1000
  • 1 <= m + n <= 2000
  • -106 <= nums1[i], nums2[i] <= 106

先用python懟了個簡單粗暴的解法,合併後排序:

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        l = nums1 + nums2
        l.sort()
        print(l)
        length = len(l)
        if length % 2: # 奇數
            return l[length // 2]
        else:
            return (l[length // 2 - 1] + l[length // 2]) / 2

難億點的思路是,求中位數其實就是求第 k 小的數的一種特殊情況。每次比較兩個數組中第 k/2 個數的大小,把不可能的數排除,然後比較剩下的數組...直到 k=1 。

還挺多坑的,改了好幾次。

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:

        def getK(l1, l2, k):
            len1, len2 = len(l1), len(l2)
            if len1 > len2:
                return getK(l2, l1, k) # 確保nums1是最短的,簡化代碼
            if len1 == 0:
                return l2[k-1]
            if k == 1:
                return min(l1[0], l2[0])
            
            i = min(len1, k//2) - 1
            j = min(len2, k//2) - 1
            
            if l1[i] > l2[j]:
                return getK(l1[:], l2[j+1:], k-j-1)
            else:
                return getK(l1[i+1:], l2[:], k-i-1)

        len3 = len(nums1)+ len(nums2)
        return (getK(nums1, nums2, (len3+1)//2) + getK(nums1, nums2, (len3+2)//2)) * 0.5 # 這樣寫就不用分奇偶了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章