题目:
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)).
Solutions(1):
//简单的,直接合并两个有序数组(类似归并排序),找出中间值即可。
复杂度应该为O(n+m),但也通过了LeetCode测试。
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int i =0;
int j =0;
int k =0;
int n1 = nums1.size();
int n2 = nums2.size();
int* merge_array = new int[n1+n2];
double median = 0.0;
while(i<n1 && j < n2)
{
if(nums1[i] < nums2[j])
{
merge_array[k++] = nums1[i++];
}
else
{
merge_array[k++] = nums2[j++];
}
}
while(i < n1)
{
merge_array[k++] = nums1[i++];
}
while(j<n2)
{
merge_array[k++] = nums2[j++];
}
if(k == 0)
{
return 0;
}
if(k %2 == 0)
{
median = (merge_array[k/2] + merge_array[k/2 - 1])/2.0;
}
else
{
median = merge_array[k/2];
}
delete[] merge_array;
return median;
}
Solution(2):
思路,转化为求第k大小数字,这里k其实就是m+n/2,奇数则直接中值大小,偶数则m+n/2和m+n/2+1两个数平均。
关于如何求两个有序数组a、b合并的第k大小数字,二分原理,假设各存在k/2个,则只需比较a[k/2]和b[k/2]。
(1)a[k/2] < b[k/2] -> a中的前k/2数字在总体的k位置之前,故扔掉,继续比较剩下的a数组和原有b数组中合并后的第k-k/2个大小的数字。
(2)a[k/2] > b[k/2] 同上
(3)相等,则任意返回一个即可
代码表示的更加清晰,如下:
//只要查找当前的第k个数即可,
double findkey(int a[],int m,int b[],int n,int k)
{
if(m > n) //使得第一个数组长度一直小于第二个长度
{
return findkey(b,n,a,m,k);
}
if(m == 0)//此时层层递减后,a数组已经没有排在k前的数字了
{
return b[k-1];
}
if(k ==1) //表示层层递减,只需找到当前组合的第一个点时
{
return min(a[0],b[0]);
}
int pa = min(m,k/2);
int pb = k - pa;
if(a[pa-1] > b[pb-1])
{
return findkey(a,m,b+pb,n-pb,k-pb);
}
else if(a[pa-1] < b[pb-1])
{
return findkey(a+pa,m-pa,b,n,k-pa);
}
else
return a[pa-1];
}
double findMedianSortedArrays(int nums1[],int n1, int nums2[],int n2) {
int total = n1+n2;
if(total & 0x1)
{
return findkey(nums1,n1,nums2,n2,total/2+1);
}
else
{
return (findkey(nums1,n1,nums2,n2,total/2) + findkey(nums1,n1,nums2,n2,total/2 +1)) /2;
}
}
参考:http://blog.youkuaiyun.com/yutianzuijin/article/details/11499917/