返回
寻找两个有序数组的中位数:Python 实现和直观解释
后端
2023-10-26 12:51:01
中位数,一个看似简单的概念,却在计算机科学和统计学领域有着广泛的应用。它代表了一组数据的中点,将数据分成两半,一半的数据大于中位数,一半的数据小于中位数。
问题陈述:
今天,我们将深入探索一个经典的问题——寻找两个有序数组的中位数。给你两个有序数组 nums1
和 nums2
,大小分别为 m
和 n
。你的任务是找出这两个有序数组合并后的中位数。
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
直观解释:
我们的算法分为两个主要步骤:
-
合并数组: 我们创建一个新数组
merged_array
,将两个有序数组nums1
和nums2
中的元素合并。这个新数组也是一个有序数组。 -
查找中位数:
- 如果
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) 的时间内高效地解决这个问题。这种算法在数据科学、机器学习和其他需要处理大量数据的领域有着广泛的应用。