给定两个大小分别为
m和n的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为
O(log (m+n))。示例 1:
输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2
要求:时间复杂度 O(log(m+n)),所以不能合并数组排序,只能用「二分 + 分割法」。
python
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
if len(nums1) > len(nums2):
nums1, nums2 = nums2, nums1
m, n = len(nums1), len(nums2)
total = m + n
left, right = 0, m
while left <= right:
i = (left + right) // 2
j = (total + 1) // 2 - i
l1 = nums1[i -1] if i > 0 else float("-inf")
r1 = nums1[i] if i < m else float("inf")
l2 = nums2[j - 1] if j > 0 else float("-inf")
r2 = nums2[j] if j < n else float("inf")
if l1 <= r2 and l2 <= r1:
if total % 2 == 1:
return max(l1, l2)
else:
return (max(l1, l2) + min(r1, r2)) / 2
elif l1 > r2:
right = i -1
else:
left = i + 1
return 0.0