这道题一开始的想法是比较中位数,在去掉较小的左半段,和较大的右半段,但十分复杂,要考虑到许多边界情况,改成求第K位数就简单很多
class Solution {
public:
int getKthSorted(vector<int>& nums1,int sta1,int len1,vector<int>& nums2,int sta2,int len2,int k)
{
if(len1>len2)
{
return getKthSorted(nums2,sta2,len2,nums1,sta1,len1,k);
}
if(len1==0)
return nums2[sta2+k-1];
if(k==1)
return min(nums1[sta1],nums2[sta2]);
int pa=min(k/2,len1);
int pb=k-pa;
if(nums1[sta1+pa-1]<nums2[sta2+pb-1])
{
return getKthSorted(nums1,sta1+pa,len1-pa,nums2,sta2,len2,k-pa);
}
else if(nums1[sta1+pa-1]>nums2[sta2+pb-1])
{
return getKthSorted(nums1,sta1,len1,nums2,sta2+pb,len2-pb,k-pb);
}
else
return nums1[sta1+pa-1];
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int n=nums1.size(),m=nums2.size();
if((m+n)%2==0)
{
return (getKthSorted(nums1,0,n,nums2,0,m,(m+n)/2)+getKthSorted(nums1,0,n,nums2,0,m,(m+n)/2+1))*1.0/2;
}
else
{
return getKthSorted(nums1,0,n,nums2,0,m,(m+n)/2+1);
}
}
};