难度困难2695
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
| 12
 3
 4
 
 | nums1 = [1, 3]nums2 = [2]
 
 则中位数是 2.0
 
 | 
示例 2:
| 12
 3
 4
 
 | nums1 = [1, 2]nums2 = [3, 4]
 
 则中位数是 (2 + 3)/2 = 2.5
 
 | 
| 12
 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
 #注意处理边界
 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
 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)
 mid2=(len1+len2+2)
 return(self.findkthelement(nums1,nums2,mid1)+self.findkthelement(nums1,nums2,mid2))/2
 
 |