class Solution:
def findMedianSortedArrays(self, A: List[int], B: List[int]) -> float:
m, n = len(A), len(B)
#有一个数组为空,直接求另一个的中位数
if m == 0:
return B[n//2]if n%2 == 1 else (B[n//2] + B[n//2-1]) / 2
if n == 0:
return A[m//2]if m%2 == 1 else (A[m//2] + A[m//2-1]) / 2
if m > n: #保证m<=n,用交换
A, B, m, n = B, A, n, m
iMin, iMax = 0, m
while iMin <= iMax: #在[iMin, iMax]之间搜索
i = (iMin + iMax) // 2 #i取中点
j = (m+n+1)//2 - i #前提约束求j
if j > 0 and i < m and B[j-1] > A[i]: #情况2
iMax += 1
elif i > 0 and j < n and A[i-1] > B[j]: #情况3
iMin -= 1
else: #情况1
if i == 0: leftMax = B[j-1]
elif j == 0: leftMax = A[i-1]
else: leftMax = max(A[i-1], B[j-1])
#若总长度为奇,则leftMax就是中位数
if (m+n)%2 == 1:
return leftMax
if i == m: rightMin = B[j]
elif j == n: rightMin = A[i]
else: rightMin = min(A[i], B[j])
#若总长度为偶,用公式计算中位数
return (leftMax + rightMin) / 2