📌  相关文章
📜  两个大小相同的排序数组的中位数(1)

📅  最后修改于: 2023-12-03 15:21:33.176000             🧑  作者: Mango

两个大小相同的排序数组的中位数

在计算机科学中,中位数是统计学中的一个重要概念,表示数值样本中的中间值。对于一组有限的数来说,它可以分为两组数,其中一组数大于中位数,另一组数小于中位数。

在一个排序数组中,如果数组长度为奇数,则中位数是数组中间的那个数;如果数组长度为偶数,则中位数是中间两个数的平均值。现在,给定两个大小相同的排序数组,要求找到这两个数组的中位数。

解题思路

首先,我们可以将两个排序数组合并成一个排序数组。合并后,我们只需要找到这个新数组的中位数即可。需要注意的是,如果新数组长度为奇数,则中位数为新数组中间的那个数;如果新数组长度为偶数,则中位数为中间两个数的平均值。

为了保证时间复杂度,我们可以不真正合并两个数组,而是使用两个指针分别指向两个数组的中间位置,通过比较两个指针所指位置的数来逐步缩小范围,直到找到中位数。

代码实现
def findMedianSortedArrays(nums1, nums2):
    """
    :type nums1: List[int]
    :type nums2: List[int]
    :rtype: float
    """
    m, n = len(nums1), len(nums2)
    if m > n:
        nums1, nums2, m, n = nums2, nums1, n, m
    i_min, i_max, half_len = 0, m, (m + n + 1) // 2
    while i_min <= i_max:
        i = (i_min + i_max) // 2
        j = half_len - i
        if i < m and nums2[j-1] > nums1[i]:
            i_min = i + 1
        elif i > 0 and nums1[i-1] > nums2[j]:
            i_max = i - 1
        else:
            if i == 0:
                max_of_left = nums2[j-1]
            elif j == 0:
                max_of_left = nums1[i-1]
            else:
                max_of_left = max(nums1[i-1], nums2[j-1])
            if (m + n) % 2 == 1:
                return max_of_left
            if i == m:
                min_of_right = nums2[j]
            elif j == n:
                min_of_right = nums1[i]
            else:
                min_of_right = min(nums1[i], nums2[j])
            return (max_of_left + min_of_right) / 2.0
时间复杂度

该算法的时间复杂度为 O(log(min(m,n))),其中 m 和 n 分别为两个输入数组的长度。这是因为每次我们都在两个数组中间位置进行二分查找,每次查找会将查找范围缩小一半,因此时间复杂度为 O(log(min(m,n)))。