问题描述: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)).
看到对时间复杂度的要求为对数级别,想到利用二分法,首先比较两个数组的中位数,假定m
class Solution {
public:
double findMedian(vector<int>& nums,int start, int length)
{
if(length%2!=0)
return (double)nums[start+length/2];
else
return ((double)nums[start+length/2]+(double)nums[start+length/2-1])/2;
}
double findEqual(vector<int>& a, vector<int>& b, int aStart, int bStart, int la, int lb)
{
int divA = la/2;
int divB = lb/2;
//int l=divA<divB? dizA: divB;
if(la==1&&lb==1)
{
return ((double)a[aStart]+(double)b[bStart])/2;
}
if(la==1)
{
if(lb%2==0)
{
if(a[aStart]<b[bStart+divB-1])
return b[bStart+divB-1];
else if(a[aStart]>b[bStart+divB])
return b[bStart+divB];
return (double)a[aStart];
}
else
{
if(a[aStart]<b[bStart+divB-1])
return ((double)b[bStart+divB-1]+(double)b[bStart+divB])/2;
else if(a[aStart]<b[bStart+divB])
return ((double)a[aStart]+(double)b[bStart+divB])/2;
else if(a[aStart]>b[bStart+divB+1])
return ((double)b[bStart+divB]+(double)b[bStart+divB+1])/2;
else if(a[aStart]<b[bStart+divB+1])
return ((double)b[bStart+divB]+(double)a[aStart])/2;
}
}
double med_a=findMedian(a,aStart,la);
double med_b=findMedian(b,bStart,lb);
if(med_a==med_b)
{
return findMedian(a,aStart,la);
}
else if(med_a<med_b)
return findEqual(a,b,aStart+divA,bStart,la-divA,lb-divA);
else
return findEqual(a,b,aStart,bStart+divA,la-divA,lb-divA);
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2)
{
int s1=nums1.size();
int s2=nums2.size();
if(s1==0||s2==0)
return (s1==0)? findMedian(nums2,0,s2):findMedian(nums1,0,s1);
if(s1<s2)
return findEqual(nums1,nums2,0,0,s1,s2);
else
return findEqual(nums2,nums1,0,0,s2,s1);
}
};