【每日一题】寻找两个正序数组的中位数

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 # 这样写就不用分奇偶了

 

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