📅  最后修改于: 2023-12-03 15:35:56.538000             🧑  作者: Mango
当我们需要处理两个大小不同的排序数组的中位数时,我们需要先明确中位数的概念。
中位数是将一个集合划分为两个长度相等的子集合的那个数值。如果集合中有奇数个元素,那么中位数就是中间那个元素;如果集合中有偶数个元素,那么中位数就是中间两个元素的平均数。
因此,为了求解两个大小不同的排序数组的中位数,我们需要将两个数组划分为左右两个部分,使得左侧部分的所有元素都小于右侧部分的所有元素,同时左右两个部分的元素个数之和相等。
如果将两个数组的长度分别记为 m 和 n,则时间复杂度为 O(log(min(m,n)))。
下面是 Python 代码的实现:
def findMedianSortedArrays(nums1, nums2):
if len(nums1) > len(nums2):
nums1, nums2 = nums2, nums1
m, n = len(nums1), len(nums2)
left, right = 0, m
while left <= right:
i = (left + right) // 2
j = (m + n + 1) // 2 - i
if i < m and nums2[j-1] > nums1[i]:
left = i + 1
elif i > 0 and nums1[i-1] > nums2[j]:
right = 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
在上述代码中,我们将长度较短的数组 nums1 作为第一个数组,可以省去一些特判。接下来,使用二分查找的方式找到一个 i,满足:
此时,左半部分的最大值为 max(nums1[i-1], nums2[j-1]),右半部分的最小值为 min(nums1[i], nums2[j])。
如果总长度为偶数,则返回左右两半部分的平均值;否则,返回左半部分的最大值。
求解两个大小不同的排序数组的中位数,可以采用二分查找的方式,将两个数组划分为左右两个部分,并保证左侧部分的所有元素都小于右侧部分的所有元素,并且左右两个部分的元素个数之和相等。时间复杂度为 O(log(min(m,n)))。