There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
You may assume nums1 and nums2 cannot be both empty.
中位数是指将一个数列分成长度相同的两部分,其中一部分所有元素都比另一个部分中所有元素大。
从位置 i 将数组A分成两部分,左半部分长度为i,右半部分长度为m-i
left_A | right_A A[0], A[1], ..., A[i-1] | A[i], A[i+1], ..., A[m-1]
同理,从位置 j 将B分成两部分
left_B | right_B B[0], B[1], ..., B[j-1] | B[j], B[j+1], ..., B[n-1]
将A、B合成到一起:
left_part | right_part A[0], A[1], ..., A[i-1] | A[i], A[i+1], ..., A[m-1] B[0], B[1], ..., B[j-1] | B[j], B[j+1], ..., B[n-1]
中位数的条件是:
1.len(left_part)=len(right_part)
2.min(right_part)>=max(left_part)
为了满足上述两个条件,则:
1.i+j=m-i+n-j,或者i+j=m−i+n−j+1(当m+n为奇数时,假设多出的一个在左边)
i=0~m,j=(m+n+1)/2−i
2.B[j-1]<=A[i] and A[i-1]<=B[j]
接下来就是本题的重点了,使用二分法找到最合适的切分位置i:
1.使imin=0,imax=m,在【imin,imax】的范围内寻找合适的i
2.既然是二分法,就从中间开始,使i=(imin+imax)/2,j=(m+n+1)/2-i
3,根据不同情况调整i
代码如下:
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
m=len(nums1)
n=len(nums2)
if m>n:
temp=nums1
nums1=nums2
nums2=temp
m=len(nums1)
n=len(nums2)
imin,imax,half=0,m,(m+n+1)/2
#print(m,n)
while imin<=imax:
i=int((imin+imax)/2)
j=int(half-i)
print(imin,imax)
if i>0 and nums2[j]<nums1[i-1]:
imax=i-1
elif i<m and nums2[j-1]>nums1[i]:
imin=i+1
else:
if i==0: max_left=nums2[j-1]
elif j==0:max_left=nums1[i-1]
else:max_left=max(nums2[j-1],nums1[i-1])
if (m+n)%2==1:
return max_left
if i==m:min_right=nums2[j]
elif j==n:min_right=nums1[i]
else: min_right=min(nums2[j],nums1[i])
print(max_left,min_right)
return (max_left+min_right)/2.0
if __name__ =='__main__':
a4=Solution()
a=a4.findMedianSortedArrays([1,3],[2])
print(a)