#4 Median of Two Sorted Arrays

题目链接:https://leetcode.com/problems/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)).


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

int FindKth(int *nums1, int n1, int *nums2, int n2, int k) {    //返回两个数组第k小的数,递归实现
    int pa = Min(n1, k / 2), pb = k - pa;   //pa,pb分别指向两个数组的第k/2个元素,数组一小于k/2个时pa指向最后一个元素
    if(n2 < n1)         //确保第一个数组短于第二个数组
        return FindKth(nums2, n2, nums1, n1, k);
    if(n1 == 0)         //基准情况,第一个数组为空时直接返回第二个数组中第k个元素
        return nums2[k - 1];
    if(k == 1)
        return Min(nums1[0], nums2[0]); //基准情况,k = 1时无法递归至上一基准情况;直接返回头结点的较小节点
    if(nums1[pa - 1] < nums2[pb - 1]) { //数组一中的第K/2个元素小于数组二中的第K/2个元素,说明小于数组一中第k/2个元素元素个数少于k个,即第k小的元素一定不在数组一中的前k/2个元素;递归查找数组一余下部分和数组二 
        return FindKth(nums1 + pa, n1 - pa, nums2, n2, k - pa);
    }
    else if(nums1[pa - 1] > nums2[pb - 1]) {
        return FindKth(nums1, n1, nums2 + pb, n2 - pb, k - pb);
    }
    else {
        return nums1[pa - 1];
    }
}

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
    int k = (nums1Size + nums2Size) / 2;
    if((nums1Size + nums2Size) % 2 == 1)        //总数为奇数,返回第k个(k为总数一半)
        return FindKth(nums1, nums1Size, nums2, nums2Size, k + 1);
    else            //总数为偶数,返回第k、第k+1个的平均数
        return (FindKth(nums1, nums1Size, nums2, nums2Size, k) + FindKth(nums1, nums1Size, nums2, nums2Size, k + 1)) / 2.0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值