Median of Two Sorted Arrays

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)).

转换题意为找到第k个数,此题k=(m+n)/2

如果时间复杂度o(k)可以接受的话,可以模拟合并,找到第k个数即可

此处要求时间复杂度O(log (m+n)).基本可以确定希望我们二分。

二分一般有两个角度,一个是对结果二分,缩小结果范围,让其逼近结果;令一个是对容器二分,缩小可选范围。

这题可以用第一个角度,找第k个数,那么我们每次排除k/2个数,时间复杂度就是O(logk).

代码:

int min(int a,int b)
{
    return a<b?a:b;
}

int findKth(int a[],int m,int b[],int n,int k)
    {
        if(m>n){//假设m总是小于等于n
            return findKth(b,n,a,m,k);
        }
        if(m==0){
            return b[k-1];
        }
        if(n==0){
            return a[k-1];
        }
        if(k==1){
            return min(a[0],b[0]);
        }
        int pa = min(k/2,m);
        int pb = k-pa;
        if(a[pa-1] < b[pb-1]){
            return findKth(a+pa,m-pa,b,n,k-pa);
        }else if(a[pa-1] > b[pb-1]){
            return findKth(a,m,b+pb,n-pb,k-pb);
        }else{
            return a[pa-1];
        }
    }

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
    if((nums1Size+nums2Size)&0x1){
        return findKth(nums1,nums1Size,nums2,nums2Size,(nums1Size+nums2Size)/2+1);
    }else{
        int res1 = findKth(nums1,nums1Size,nums2,nums2Size,(nums1Size+nums2Size)/2);
        int res2 = findKth(nums1,nums1Size,nums2,nums2Size,(nums1Size+nums2Size)/2+1);
        return (res1+res2)/2.0;
    }
}

参考:http://blog.csdn.net/yutianzuijin/article/details/11499917/

原文地址:https://www.cnblogs.com/zengzy/p/5013561.html