📅  最后修改于: 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)))。