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

给定两个大小分别为 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

//将数组排为从小到大的正序

//这里的arr是要被排序的数组
Arrays.sort(arr);

//将数组排位从大到小排序

// 将数组转换为包装类型,使用 Collections.reverseOrder()
Arrays.sort(arr, Collections.reverseOrder());

这里是测试样例

public static void main(String[] args) {
        FindTheMiddleOfTwoNumbers findTheMiddleOfTwoNumbers = new FindTheMiddleOfTwoNumbers();

        int[] nums1 = {1,2,3};
        int[] nums2 = {2, 3, 4};
        double median = findTheMiddleOfTwoNumbers.findMedianSortedArrays(nums1, nums2);
        System.out.println("Median: " + median);
    }

对于中位数的取值逻辑

double TheMedian = 0;//中位数取值初始化
//中位数取值的逻辑
if (n % 2 == 0) {
  TheMedian = (mergedArray[n / 2] + mergedArray[(n / 2) - 1]) / 2.00;
}else {
  TheMedian = mergedArray[n / 2];
}

return TheMedian;

对于空数组的逻辑处理

//空数组的处理
if (nums1 == null || nums1.length == 0) {
  return nums2;
}

if (nums2 == null || nums2.length == 0) {
  return nums1;
}

对于两个正序数组的排序逻辑

//nums1和nums2排序的逻辑
        int i = 0;
        int j = 0;
        int index = 0;
        while (i < nums1.length && j < nums2.length){
            if (nums1[i] < nums2[j]) {
                arr[index] = nums1[i];
                i++;
            }else {
                arr[index] = nums2[j];
                j++;
            }
            index++;
        }
        //当nums1有余项时
        while (i < nums1.length){
            arr[index] = nums1[i];
            ++index;
            i++;
        }
        //当nums2有余项时
        while (j < nums2.length){
            arr[index] = nums2[j];
            ++index;
            j++;
        }

        return arr;

代码汇总

public class FindTheMiddleOfTwoNumbers {

    public static void main(String[] args) {
        FindTheMiddleOfTwoNumbers findTheMiddleOfTwoNumbers = new FindTheMiddleOfTwoNumbers();

        int[] nums1 = {1,2,3};
        int[] nums2 = {2, 3, 4};
        double median = findTheMiddleOfTwoNumbers.findMedianSortedArrays(nums1, nums2);
        System.out.println("Median: " + median);
    }

    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        //此处提供mergeArrays方法,用来对nums1,nums2排序
        int[] mergedArray = mergeArrays(nums1,nums2);
        int n = mergedArray.length;
        double TheMedian = 0;//中位数取值初始化
        //中位数取值的逻辑
        if (n % 2 == 0) {
            TheMedian = (mergedArray[n / 2] + mergedArray[(n / 2) - 1]) / 2.00;
        }else {
            TheMedian = mergedArray[n / 2];
        }

        return TheMedian;
    }

    private int[] mergeArrays(int[] nums1, int[] nums2) {
        int n1 = nums1.length;
        int n2 = nums2.length;
        //定义一个数组arr,用来存放排序nums1和nums2的结果
        int[] arr = new int[n1 + n2];

        //空数组的处理
        if (nums1 == null || nums1.length == 0) {
            return nums2;
        }

        if (nums2 == null || nums2.length == 0) {
            return nums1;
        }

        //nums1和nums2排序的逻辑
        int i = 0;
        int j = 0;
        int index = 0;
        while (i < nums1.length && j < nums2.length){
            if (nums1[i] < nums2[j]) {
                arr[index] = nums1[i];
                i++;
            }else {
                arr[index] = nums2[j];
                j++;
            }
            index++;
        }
        //当nums1有余项时
        while (i < nums1.length){
            arr[index] = nums1[i];
            ++index;
            i++;
        }
        //当nums2有余项时
        while (j < nums2.length){
            arr[index] = nums2[j];
            ++index;
            j++;
        }

        return arr;
    }


}
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值