给定两个大小分别为 m
和 n
的正序(从小到大)数组 nums1
和 nums2
。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n))
。
示例 1:
输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2
方法1:
O(m+n)
def solve(nums1,nums2):
n1=len(nums1)
n2=len(nums2)
n=n1+n2
tmp=[]
i,j=0,0
while i<=n1-1 and j<=n2-1:
if nums1[i]<nums2[j]:
tmp.append(nums1[i])
i+=1
else:
tmp.append(nums2[j])
j+=1
while i<=n1-1:
tmp.append(nums1[i])
i+=1
while j<=n2-1:
tmp.append(nums2[j])
j+=1
if n%2==1:
return tmp[n//2]
else:
return (tmp[n//2-1]+tmp[n//2])/2
方法2:
O(log(m+n))
def solve(nums1,nums2):
m=len(nums1)
n=len(nums2)
l=m+n
def getkmin(k):
i,j=0,0
while True:
if m==i:
return nums2[j+k-1]
if n==j:
return nums1[i+k-1]
if k==1:
return min(nums1[i],nums2[j])
newi=min(i+k//2-1,m-1)
newj=min(j+k//2-1,n-1)
p1=nums1[newi]
p2=nums2[newj]
if p1<=p2:
k-=newi-i+1
i=newi+1
else:
k-=newj-j+1
j=newj+1
if l%2==1:
return getkmin((l+1)//2)
else:
return (getkmin(l//2)+getkmin(l//2+1))/2