难度困难2695
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1
和 nums2
。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1
和 nums2
不会同时为空。
示例 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 #注意处理边界 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
|