LeetCode 4. 寻找两个有序数组的中位数

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

示例 1:

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

则中位数是 2.0

示例 2:

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

则中位数是 (2 + 3)/2 = 2.5

题意:求两个有序数组的中位数。看到O(log(m+n)),就分治法(二分法?)。
思路:中位数的概念,一组数中,有几个比中位数大的就有几个比中位数小的。如果这组数是奇数n,中位数index是n/2.。如果是偶数,中位数是index为n/2 和(n-1)/2的平均数。设中位数index为k,求两有序数组中第k小即可。

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        def findKthElement(arr1, arr2, k):
            len1, len2 = len(arr1), len(arr2)
            //让arr1存长度较小的数组
            if len1 > len2:
                return findKthElement(arr2, arr1, k)
            //如果arr1不存在,直接在arr2找中位数
            if not arr1:
                return arr2[k-1]
            //如果k==1,意思是找第一小的,就找两数组中最小的一个。
            if k == 1:
                return min(arr1[0], arr2[0])
            //i,j分别存储当前找的index。找第k小,分两个数组,每个数组从k/2开始找起。
            i, j = min(k // 2, len1) - 1, min(k//2, len2)-1
            // 如果arr1[i]大于arr2[j],说明i位置不是中位数,因为arr2中有大于中位数的话,大于中位数的量要大于小于中位数的量,不符合中位数的定义。所以继续找。现知信息arr2[0:j-1]全部小于arr1[i],中位数可以从arr2[j+1:]和arr1中找,其中,中位数的index从,第k小,变成了k-j-1小。
            if arr1[i] > arr2[j]:
                return findKthElement(arr1, arr2[j+1:], k-j-1)
            //反之也是。
            else:
                return findKthElement(arr1[i+1:], arr2, k-i-1)
        //
        l1, l2 = len(nums1), len(nums2)
        // 对于奇偶问题,直接取两个中位数(可能相等)的平均数,left对应index即为第k小。
        left, right = (l1+l2+1)//2, (l1+l2+2)//2
        return (findKthElement(nums1, nums2, left) + findKthElement(nums1, nums2, right)) /2

不好理解看 博客 C语言:https://blog.csdn.net/kenby/article/details/6833407

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值