4. 寻找两个正序数组的中位数

难度困难2695

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1nums2

请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1nums2 不会同时为空。

示例 1:

1
2
3
4
nums1 = [1, 3]
nums2 = [2]

则中位数是 2.0

示例 2:

1
2
3
4
nums1 = [1, 2]
nums2 = [3, 4]

则中位数是 (2 + 3)/2 = 2.5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution:
#二分法,对于arr1,arr2,k:令x=k//2,如果arr1[x]<arr2[x]说明arr1的前x元素不可能出现第k大个元素,去掉;相应k应该减小;
#注意处理边界
def findkthelement(self,arr1:List[int],arr2:List[int],k)->float:
len1=len(arr1)
len2=len(arr2)
if len1>len2:
return self.findkthelement(arr2,arr1,k)
##确保arr1是短的一边;
if not arr1:
#arr1为空,递归结束
return arr2[k-1]
if k==1:
#返回最小的元素
return min(arr1[0],arr2[0])
x=k//2
i=int(min(x,len1)-1) #arr1的边界;因为是数组所以要减一,代表有i+1个元素
j=int(min(x,len2)-1)
if arr1[i]<arr2[j]:
return self.findkthelement(arr1[i+1:],arr2,k-i-1)
else:
return self.findkthelement(arr1,arr2[j+1:],k-j-1)

def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
len1=len(nums1)
len2=len(nums2)
#考虑中位数的奇偶问题
mid1=(len1+len2+1)//2
mid2=(len1+len2+2)//2
return(self.findkthelement(nums1,nums2,mid1)+self.findkthelement(nums1,nums2,mid2))/2