代码及思路来源:https://blog.csdn.net/LoveHYZH/article/details/92760709
博主在分类时的表格十分好,让人一目了然,借鉴展示如下(侵删):
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
m, n = len(nums1), len(nums2)
# 这里为了保证nums1一定是长度较小的数组
if m > n:
nums1, nums2, m, n = nums2, nums1, n, m
# 题目给定数组不会同时为空,也就是m^2+n^2≠0,由于m≤n,故只要n≠0即可
if not n:
raise ValueError("数组长度不同时为零")
i_min, i_max = 0, m
# left集合元素数量,如果m+n是奇数,left比right多一个数据
count_of_left = (m + n + 1) // 2
while i_min <= i_max:
i = (i_min + i_max) // 2 # left有i个nums1的元素
j = count_of_left - i # left有j个nums2的元素
if i > 0 and nums1[i - 1] > nums2[j]:
i_max = i - 1 # i太大,要减少
elif i < m and nums1[i] < nums2[j - 1]:
i_min = i + 1 # i太小,要增加
else: # i刚好
if i == 0: # 此时数组1全部被划到右边
max_of_left = nums2[j - 1]
elif j == 0: # 此时数组2全部被划到右边
max_of_left = nums1[i - 1]
else:
max_of_left = max(nums1[i - 1], nums2[j - 1])
if (m + n) % 2:
return float(max_of_left) # 结果是浮点数
if i == m: # 此时数组1全部被划到左边
min_of_right = nums2[j]
elif j == n: # 此时数组2全部被划到左边
min_of_right = nums1[i]
else:
min_of_right = min(nums1[i], nums2[j])
return (max_of_left + min_of_right) / 2.0 # 结果为浮点数