【力扣C语言】4.寻找两个正序数组的中位数

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

示例 1:

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

示例 2:

输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

【题目说明】:
  这道题有简单的思路,就是合并后再进行处理。但是时间上就要慢了,而且还要开辟额外的空间。我的思路是给两个数组分别设立前后两个指针。比较前指针找出两个数组较小的数,比较后指针找出两个数组较大的数。对指针进行++或–,最终找到中位数。
  主要步骤并不难,难在指针对于数组边界的判断。当指针到达边界后要对数组进行另外处理。下面代码并不算很优秀,有一些步骤重复,希望网友有好点子可以自行修改。

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
    //设立两个指针,分别从小向大,和从大到小。当两个指针满足条件时就找到中位数。
    int p, q;
    //分别代表数组1和数组2的遍历前指针
    int form1, form2;
    form1 = form2 = 0;
    //代表数组1和数组2的遍历尾指针
    int last1, last2;
    last1 = nums1Size-1;
    last2 = nums2Size-1;
    //随便赋值,目的是进入循环
    p = 0;
    q = 1;
    //中位数
    double mid;

    while(p < q){
        if(form1 == nums1Size){     //form1达到边界
            p = nums2[form2];
            form2++;
        }else if(form2 == nums2Size){   //from2达到边界
            p = nums1[form1];
            form1++;
        }else{
        	//两个数组前指针从前往后都未达到边界
            if(nums1[form1]<=nums2[form2]){
                p = nums1[form1];
                form1++;
            }else{
                p = nums2[form2];
                form2++;
            }
        }
        
        if(last1 < 0){      //last1达到边界
            q = nums2[last2];
            last2--;
        }else if(last2 < 0){    //last2达到边界
            q = nums1[last1];
            last1--;
        }else{
            //两个数组后指针从后往前都未达到边界
            if(nums1[last1]>=nums2[last2]){
                q = nums1[last1];
                last1--;
            }else{
                q = nums2[last2];
                last2--;
            }
        }
        //在符合条件的情况下,计算中位数
        if(p <= q)
            mid = (p+q)/2.0;
    }
    return mid;
}
//数组的边界问题
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值