Hard-题目50:4. 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)).
题目大意:
求两个排序好的数组合并起来的中位数。
题目分析:
这是一道经典题,那也用经典的代码解决。,
这个findKth()函数写的非常精彩,几乎所有的博文用的都是这个函数。思路如下:
1. 保持A是短的那一个数组,B是长的
2. 平分k, 一半在A,一半在B (如果A的长度不足K/2,那就pa就指到最后一个)
3. 如果pa的值 < pb的值,那证明第K个数肯定不会出现在pa之前,递归,把A数组pa之前的砍掉,同理递归砍B数组。
4. 递归到 m == 0 (短的数组用完了) 就返回 B[k - 1], 或者k == 1(找第一个数)就返回min(A第一个数,B第一个数)。
不过直接把网上的经典代码丢进去会Compile Error,经过我的简单改装,得到了可以直接用的ac代码
源码:(language:c)

#define min(a,b) a<b?a:b
double findKth(int *a, int m, int *b, int n, int k)  
{  
    //always assume that m is equal or smaller than n 
    if (m > n)  
        return findKth(b, n, a, m, k);  
    if (m == 0)  
        return b[k - 1];  
    if (k == 1)  
        return min(a[0], b[0]);  
    //divide k into two parts 
    int pa = min(k / 2, m), 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) {
    int total = nums1Size + nums2Size;  
    if (total%2)  
        return findKth(nums1, nums1Size, nums2, nums2Size, total / 2 + 1);  
    else  
        return (findKth(nums1, nums1Size, nums2, nums2Size, total / 2)  
                + findKth(nums1, nums1Size, nums2, nums2Size, total / 2 + 1)) / 2;  
}

成绩:
20ms,66.18%,24ms,44.85%
cmershen的碎碎念:
这道题属于比较老的经典题,这个findKth算法又很具有普遍性(寻找两个数组中第k大的数)应该是面试的重点,且此题应该也是难点。

你可能感兴趣的:(Hard-题目50:4. Median of Two Sorted Arrays)