4.寻找两个正序数组的中位数

题目

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

算法的时间复杂度应该为 O(log (m+n)) 。
在这里插入图片描述

分析

如果第一个字符串长度是len1,第二个字符串长度是len2,两个数组合并之后个数可能是奇数也可能是偶数,求中位数需要下图公式进行统一,我们需要找第(len1+len2+1)/2大的数和第(len1+len2+2)/2大的数然后再除以2就大功告成。
在这里插入图片描述
如何找第(len1+len2+1)/2大的数和第(len1+len2+2)/2大的数?就当作是找第k大的数
我们在两个数组中各取k/2个数的数组,然后比较两个数组k/2-1的下标对应的值,由于两个数组都是正序,去掉比较小的值前面的数(包括小的值)
k = 5
在这里插入图片描述
k = 5-2=3
在这里插入图片描述
k = 3-1=2
在这里插入图片描述
k = 2-1=1
在这里插入图片描述
发现其实可以通过调整下标的递归的方式来找到第k大的数,具体详细见代码。

代码

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int m = nums1.length;
        int n = nums2.length;
        return (getK(nums1,nums2,0,m-1,0,n-1,(m+n+1)/2)+getK(nums1,nums2,0,m-1,0,n-1,(m+n+2)/2))*0.5;
    }
    int getK(int[] nums1,int[] nums2,int l1,int r1,int l2,int r2,int k){
        int len1 = r1-l1+1;
        int len2 = r2-l2+1;
        if(len1>len2){
            return getK(nums2,nums1,l2,r2,l1,r1,k);
        }
        if(len1 ==0){
            return nums2[l2+k-1];
        }
        if(k==1){
            return Math.min(nums1[l1],nums2[l2]);
        }
        int idx1 = l1+Math.min(len1,(k/2))-1;
        int idx2 = l2+Math.min(len2,(k/2))-1;
        if(nums1[idx1]>nums2[idx2]) return getK(nums1,nums2,l1,r1,idx2+1,r2,k-(idx2-l2+1));
        return getK(nums1,nums2,idx1+1,r1,l2,r2,k-(idx1-l1+1));
    }
}

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙崎流河

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值