思路
基本只能靠背。边缘条件太恶心了...
代码
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
m, n = len(nums1), len(nums2)
if m > n: # 上面的要小一点,确保切割有效。试想上面如果很长有10个,下面只有一个,如果上面左边只有两个,那下面无法满足上面的。
nums1, nums2 = nums2, nums1
m, n = n, m
left, right = 0, m
while left <= right:
i = left + (right - left) // 2 # i是切割那条缝的右边的index
j = (m + n + 1) // 2 - i # i + j = (m + n + 1) // 2 & 如果是单数个,左边分多一个
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: # 符合条件的话,先找左边最大值
left_max = nums2[j - 1]
elif j == 0:
left_max = nums1[i - 1]
else:
left_max = max(nums1[i - 1], nums2[j - 1])
if (m + n) % 2 == 1: # 如果是单数个就可以直接返回
return left_max
if i == m: # 复数个的话就再找右边最小值,求平均
right_min = nums2[j]
elif j == n:
right_min = nums1[i]
else:
right_min = min(nums1[i], nums2[j])
return (left_max + right_min) / 2