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

发现自己一年没写点东西了,感觉蛮可怕的,所以要求自己每天记录一下自己做的
题目:给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))

你可以假设 nums1 和 nums2 不会同时为空

示例 1:

nums1 = [1, 3]
nums2 = [2]

则中位数是 2.0
示例 2:

nums1 = [1, 2]
nums2 = [3, 4]

则中位数是 (2 + 3)/2 = 2.5

来源:力扣(LeetCode)

鉴于平时感觉找个代码看不懂,所以先写个思路,并且题目重点内容我也做了加粗表示了,代码中也加了注释希望对大家有帮助。
思路:考虑到题目中的种种要求,所以我采取倒序有序把两个数组中的数据放于新数组,中位数只在新数据中按照位置找到即可了。插入的时候分为两种情况,两个数组都有数据就把大的先插入数组,只有一个数组有数据的话就把该数组直接插入新数组即可。

public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int m=nums1.length-1;
        int n=nums2.length-1;     //为了下面赋值直接可以用所以做了-1处理
        double middle;              //代表最后结果值
        int mid=(nums1.length+nums2.length)/2;      //为了后面计算中位数
        int data[] = new int[nums1.length+nums2.length];
        for (int i = (m+n+1); i >=0 ; i--) {
            if((m>0||m==0)&&(n>0||n==0)){      //第一种情况 两个数组里都有值取最大的
                if(nums1[m]>nums2[n]){
                    data[i]=nums1[m--];
                }else{
                    data[i]=nums2[n--];
                }
            }else if((m>0||m==0)&&n<0){        //第二种情况  1.只有nums1数组有值那就直接拿nums1的
                data[i]=nums1[m--];
            }else if((n>0||n==0)&&m<0){        //2.只有nums2数组有值那就直接拿nums2的
                data[i]=nums2[n--];
            }
        }
        if((nums1.length+nums2.length)%2==0){
            middle=(data[mid-1]+data[mid])/2.0;
        }else{
            middle=data[mid];
        }
        return middle;
    }

原生的省时间,下面再来一个省力的,每次写完两方一对比总有意外小收获。

 public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int[] arr = new int[nums1.length+nums2.length];
        for(int i=0;i<nums1.length;i++){
            arr[i] = nums1[i];
        }
        for(int i=0;i<nums2.length;i++){
            arr[i+nums1.length]=nums2[i];
        }
        Arrays.sort(arr);
        double num;
        if (arr.length%2==0){
            num = Double.valueOf(arr[arr.length/2-1]+arr[arr.length/2]);
            num = num/2;
        }else {
            num = Double.valueOf(arr[arr.length/2]);
        }
        return num;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值