LeetCode-4-Median of Two Sorted Arrays(C语言实现)

来源:互联网 发布:步步惊情39网络完整版 编辑:程序博客网 时间:2024/05/18 00:56

最基本的方法先按生序合并数组再查找;更好的方法是利用递归算法,如下记录。

两个有序数组a、b中找到第k小的数字:比较a[k/2-1]和b[k/2-1],即分别有k/2个数字比被比较的这两个数字更小,如果a[k/2-1]<b[k/2-1],则可以肯定a[k/2-1]比所有数中第k小的数还要小,从而可以把a数组中第一位到被该位全部剔除,再在新数组a'和b数组中递归查找第(k-k/2)小的数字。

注意:递归过程中k/2可能会大于某一数组的长度,要分类处理,规避数组越界。

关于边界处理:分两种情况,a或b数组有一个为空;a和b数组都非空且k为1。



double findKth(int* a,int len1, int* b,int len2, int k){

    int mid1 = (k/2) < len1 ? (k/2) : len1;

    int mid2 = (k/2) < len2 ? (k/2) : len2;

    if(len1 == 0)

        return b[k - 1];

    if(len2 == 0)

        return a[k - 1];

    if(k == 1)

        return a[0] < b[0] ? a[0] : b[0];

    if(a[mid1 - 1] <= b[mid2 -1])

        return findKth(a + mid1, len1 - mid1, b, len2, k - mid1);

    else

        return findKth(a, len1, b + mid2, len2 - mid2, k - mid2);

}


double findMedianSortedArrays(int* nums1,int nums1Size, int* nums2,int nums2Size) {

    int k = nums1Size + nums2Size;

    if(k % 2 ==1)

        return findKth(nums1, nums1Size, nums2, nums2Size, k/2 +1);

    else

        return (findKth(nums1, nums1Size, nums2, nums2Size, k/2 +1) +

                findKth(nums1, nums1Size, nums2, nums2Size, k/2)) /2.0;

}


原创粉丝点击