寻找两个有序数组的中位数

寻找两个有序数组的中位数。
给定两个大小为m和n的有序数组num1和num2.
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为O(log(m+n))。
你可以假设这两数组不会同时为空。

示例1
num1 = [1,3]
num2 = [2]
则中位数为 2.0

示例2
num1 = [1,2]
num2 = [3,4]
则中位数为(2 + 3) / 2 =2.5

解题思路
1.题目获取两个数组的中位数,那么遍历这两个数组到他们的中间位置
2.判断数组总个数是偶数个还是奇数个

第一种:利用辅助数组
1.通过将判断num1数组是否为空,若为空则目标数组的起始位置需要改变
2.将数组进行排序
3.如果合并后的数组总个数为1个时,那么中位数直接是本身;
如果个数是偶数个时,那么中位数是: (num[x / 2] + num[x / 2 - 1]) / 2.0;
如果个数为奇数个时,那么中位数是:num[x / 2];

public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
    double media = 0;
    int x = nums1.length + nums2.length;
    int [] num = new int[x];
    if (nums1.length != 0){
        System.arraycopy(nums1,0,num,0,nums1.length);
        System.arraycopy(nums2,0,num,nums1.length ,nums2.length);
    }else {
        System.arraycopy(nums2,0,num,0,nums2.length);
    }
    Arrays.sort(num);
    if (x % 2 == 0){
        media = (num[x / 2] + num[x / 2 - 1]) / 2.0;
    }else if (x != 1){
        media = num[x / 2];
    }else {
        media = num[0];
    }
    return media;
}
      

第二种:假设这两数组不会同时为空

public static double findMedianSortedArrays_1(int[] nums1, int[] nums2) {
    int x = nums1.length + nums2.length;
    int [] num = new int[x];
    int m = nums1.length;
    int n = nums2.length;
    if (m == 0 || nums1 == null){
     return media(nums2,n);
    } else if (n == 0 || nums2 == null){
        return  media(nums1,m);
    } else {
        System.arraycopy(nums1,0,num,0,nums1.length);
        System.arraycopy(nums2,0,num,nums1.length ,nums2.length);
        Arrays.sort(num);
        System.out.println("数组是: "+num);
        return media(num,x);
    }
}
 
public static double media(int [] num,int x){
    if (x % 2 == 0){
        return  (num[x / 2] + num[x / 2 - 1]) / 2.0;
    }else if (x != 1){
       return num[x / 2];
    }else {
       return num[0];
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值