码迷,mamicode.com
首页 > 其他好文 > 详细

Median of Two Sorted Arrays

时间:2015-12-02 17:55:53      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

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/

Median of Two Sorted Arrays

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!