打卡-寻找两个正序数组的中位数

1. 题目描述

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

2. 示例

在这里插入图片描述

3. 提示
  1. nums1.length == m
  2. nums2.length == n
  3. 0 <= m,n <= 1000
  4. 1 <= m+n <= 2000
  5. -10^6 <= nums1[i],nums2[i] <= 10^6
4. solution
  1. 一开始看到题目等级为困难,我吓一跳,寻思那就用递归的思路进行解题,结果需要处理的情况较多较为复杂,且花费了较长时间,最终还是妥协了,还是用另一种简单方法吧。
  2. 除了处理特殊情况外,直接用合并排序将两个数组合成一个数组,再寻找中位数即可。代码如下:
class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        // 1.若某一数组为空
        if(nums1.length == 0){
            int mid = nums2.length / 2;
            if(nums2.length%2 == 0){
                return (nums2[mid-1] + nums2[mid]) / 2.0;
            }else{
                return nums2[mid];
            }
        }
        if(nums2.length == 0){
            int mid = nums1.length / 2;
            if(nums1.length%2 == 0){
                return (nums1[mid-1] + nums1[mid]) / 2.0;
            }else{
                return nums1[mid];
            }
        }
        // 2. 两数组中位数相同,直接返回
        int mid1 = (nums1.length-1) / 2, mid2 = (nums2.length-1) / 2;
        double median1,median2;
        if(nums1.length % 2 == 1){
            median1 = nums1[mid1];
        }else{
            median1 = (nums1[mid1] + nums1[mid1+1]) / 2.0;
        }
        if(nums2.length % 2 == 1){
            median2 = nums2[mid2];
        }else{
            median2 = (nums2[mid2] + nums2[mid2+1]) / 2.0;
        }
        if(median1 == median2){
            return median1;
        }
        // 2. 两数组均不为空 且 中位数不同
        int[] arr = new int[nums1.length + nums2.length];
        int i = 0,j = 0,k = 0;
        while(i<nums1.length && j<nums2.length){
            if(nums1[i] <= nums2[j]){
                arr[k++] = nums1[i++];
            }else{
                arr[k++] = nums2[j++];
            }
        }
        while(i < nums1.length){
            arr[k++] = nums1[i++];
        }
        while(j < nums2.length){
            arr[k++] = nums2[j++];
        }
        int mid = (arr.length-1) / 2;
        if(arr.length % 2 == 0){
            return (arr[mid] + arr[mid+1]) / 2.0;
        }
        return arr[mid];
    }
}
5. 题目来源

力扣

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值