给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
示例 3:
输入:nums1 = [0,0], nums2 = [0,0]
输出:0.00000
示例 4:
输入:nums1 = [], nums2 = [1]
输出:1.00000
示例 5:
输入:nums1 = [2], nums2 = []
输出:2.00000
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
方案一:
class Solution:
def getMiddle(self,nums):
if(len(nums)%2 != 0):
return nums[int((len(nums)-1)/2)]
else:
middle = int(len(nums)/2)
return (nums[middle]+nums[middle-1])/2
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
if(not nums1 or not nums2):
return self.getMiddle(nums1) if nums1 else self.getMiddle(nums2)
length = len(nums1)+len(nums2)
middle = int((length-1)/2) if(length %2 !=0) else int(length/2)
m1 = m2 = 0
l = []
while m1<len(nums1) and m2<len(nums2):
if(nums1[m1] < nums2[m2]):
l.append(nums1[m1])
m1 += 1
else:
l.append(nums2[m2])
m2 += 1
if(m1+m2 > middle):return l[middle] if(length%2 !=0) else (l[middle]+l[middle-1])/2
l += nums1[m1:] if(m1<len(nums1)) else nums2[m2:]
return l[middle] if(length%2 !=0) else (l[middle]+l[middle-1])/2
方案二:
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
if len(nums1) > len(nums2):
return self.findMedianSortedArrays(nums2, nums1)
infinty = 2**40
m, n = len(nums1), len(nums2)
left, right = 0, m
# median1:前一部分的最大值
# median2:后一部分的最小值
median1, median2 = 0, 0
while left <= right:
# 前一部分包含 nums1[0 .. i-1] 和 nums2[0 .. j-1]
# // 后一部分包含 nums1[i .. m-1] 和 nums2[j .. n-1]
i = (left + right) // 2 # ( 0 + m) //2 -> m //2
j = (m + n + 1) // 2 - i #
# nums_im1, nums_i, nums_jm1, nums_j 分别表示 nums1[i-1], nums1[i], nums2[j-1], nums2[j]
nums_im1 = (-infinty if i == 0 else nums1[i - 1])
nums_i = (infinty if i == m else nums1[i])
nums_jm1 = (-infinty if j == 0 else nums2[j - 1])
nums_j = (infinty if j == n else nums2[j])
if nums_im1 <= nums_j:
median1, median2 = max(nums_im1, nums_jm1), min(nums_i, nums_j)
left = i + 1
else:
right = i - 1
return (median1 + median2) / 2 if (m + n) % 2 == 0 else median1