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)).
Difficulty: Hard
对于两个排序数组,找出中位数。算法复杂度为O(log(m+n))
分析:
一开始看到这个算法复杂度的时候自然想到了二分法,就尝试着对两个数组分别取中位数进行比较,然后肯定能去除某个数组中的一半元素,但是发现每次去掉一半的元素好像无法控制刚好到两个数组的中位数。
后来看别人的博客找到了比较好的方法,即通过寻找第K小的值来实现寻找数组的中位数。
为了寻找两个数组的第k小数,算法每次只需要对两个数组的第k/2的值进行比较即可,其中较小值对应的前k/2个数肯定可以去掉,这样对剩下的数组再进行寻找第k/2小的数即可。
实际操作时需要考虑一些特殊情况,比如k/2大于某个数组长度时,取数组长度的值作为要剔除的数目。
参考链接 http://blog.csdn.net/yutianzuijin/article/details/11499917
//寻找两个排序数组中的第K大元素,m和n表示nums1和nums2的数组长度
#define min(x,y) ((x)<(y)? (x):(y))
int findKthValue(int *nums1,int m,int *nums2,int n,int k)
{
int pa=min(k>>1,m);
if(m==0)
return nums2[k-1];
if(n==0)
return nums1[k-1];
if(m>n)
return findKthValue(nums2,n,nums1,m,k);
if(k==1)
return min(nums1[0],nums2[0]);
if(pa==0)
return nums2[k-1];
if(nums1[pa-1]>nums2[pa-1])
return findKthValue(nums1,m,&nums2[pa],n-pa,k-pa);
if(nums1[pa-1]<nums2[pa-1])
return findKthValue(&nums1[pa],m-pa,nums2,n,k-pa);
if(nums1[pa-1]==nums2[pa-1])
{
if(k==pa<<1)
return nums1[pa-1];
else
return findKthValue(&nums1[pa],m-pa,&nums2[pa],n-pa,k-2*pa);
}
}
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size)
{
int total=nums1Size+nums2Size;
if(total&1)
return findKthValue(nums1,nums1Size,nums2,nums2Size,(total>>1)+1);
else
return(findKthValue(nums1,nums1Size,nums2,nums2Size,total>>1)+findKthValue(nums1,nums1Size,nums2,nums2Size,(total>>1)+1))/2.0;
}