返回

寻找两个有序数组的中位数:Python 实现和直观解释

后端

中位数,一个看似简单的概念,却在计算机科学和统计学领域有着广泛的应用。它代表了一组数据的中点,将数据分成两半,一半的数据大于中位数,一半的数据小于中位数。

问题陈述:

今天,我们将深入探索一个经典的问题——寻找两个有序数组的中位数。给你两个有序数组 nums1nums2,大小分别为 mn。你的任务是找出这两个有序数组合并后的中位数。

Python 实现:

def find_median_sorted_arrays(nums1, nums2):
    """
    查找两个有序数组 nums1 和 nums2 的中位数

    :param nums1: 有序数组 1
    :param nums2: 有序数组 2
    :return: nums1 和 nums2 合并后的中位数
    """
    # 合并两个有序数组
    merged_array = merge_sorted_arrays(nums1, nums2)

    # 计算合并后数组的长度
    length = len(merged_array)

    # 如果合并后数组的长度为偶数,中位数为两个中间元素的平均值
    if length % 2 == 0:
        mid1 = merged_array[length // 2 - 1]
        mid2 = merged_array[length // 2]
        return (mid1 + mid2) / 2

    # 如果合并后数组的长度为奇数,中位数为中间元素
    else:
        return merged_array[length // 2]


def merge_sorted_arrays(nums1, nums2):
    """
    合并两个有序数组 nums1 和 nums2

    :param nums1: 有序数组 1
    :param nums2: 有序数组 2
    :return: 合并后的有序数组
    """
    merged_array = []
    i1, i2 = 0, 0

    # 逐个比较两个数组的元素,将较小的元素添加到合并数组中
    while i1 < len(nums1) and i2 < len(nums2):
        if nums1[i1] < nums2[i2]:
            merged_array.append(nums1[i1])
            i1 += 1
        else:
            merged_array.append(nums2[i2])
            i2 += 1

    # 将剩余元素添加到合并数组中
    while i1 < len(nums1):
        merged_array.append(nums1[i1])
        i1 += 1

    while i2 < len(nums2):
        merged_array.append(nums2[i2])
        i2 += 1

    return merged_array

直观解释:

我们的算法分为两个主要步骤:

  1. 合并数组: 我们创建一个新数组 merged_array,将两个有序数组 nums1nums2 中的元素合并。这个新数组也是一个有序数组。

  2. 查找中位数:

    • 如果 merged_array 的长度是偶数,中位数是两个中间元素的平均值。
    • 如果 merged_array 的长度是奇数,中位数是中间元素。

这个算法的复杂度为 O(m + n),其中 m 和 n 分别是两个数组的长度。它遍历两个数组一次,并合并它们以查找中位数。

实例:

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

median = find_median_sorted_arrays(nums1, nums2)
print(median)  # 输出:4

在给定的示例中,合并后的数组为 [1, 2, 3, 4, 5, 6]。因为长度为偶数,中位数是中间两个元素的平均值,即 (3 + 4) / 2 = 4。

总结:

寻找两个有序数组的中位数是一个经典问题,它可以用简洁明了的算法解决。通过将两个数组合并成一个有序数组并查找中位数,我们可以在 O(m + n) 的时间内高效地解决这个问题。这种算法在数据科学、机器学习和其他需要处理大量数据的领域有着广泛的应用。