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

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

简单分析:

所谓中位数就是一个数据中居于中间位置的数,两个数组(m+n) /2位置的数据是我们要找的数据,所以该问题的关键点有两个:

  1. 遍历两个数组,查找第(m+n)/2位置的数字
  2. 考虑数组的长度奇偶性,需要记录索引(m+n)/2位置之前的那个数字
class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int len1 = nums1== null ? 0 : nums1.length;
        int len2 = nums2== null ? 0 : nums2.length;
        if (len1==0 && len2 == 0){
            throw new RuntimeException("arr has no num");
        }else if (len1 == 0){
            return findMedianInOneArrays(nums2);
        }else if (len2 == 0){
            return findMedianInOneArrays(nums1);
        }
        int minVal = Math.min(nums1[0], nums2[0]);
        // 中位数索引,需要查询的次数
        int midIndex = (len1 + len2) >> 1;
        // 中位数值
        int midVal1 = minVal, midVal2 = minVal;
        int tail1 = 0, tail2 = 0;
        int index = 0;
        while (tail1 < len1 && tail2 < len2){
            index ++;
            midVal1 = midVal2;
            if (nums1[tail1] < nums2[tail2]){
                midVal2 = nums1[tail1];
                if (tail1 < len1)
                    tail1 ++;
                else
                    break;
            }else
            {
                midVal2 = nums2[tail2];
                if (tail2 < len2)
                    tail2 ++;
                else
                    break;
            }
            if (index > midIndex){
                break;
            }
        }
        for (; index <= midIndex ; index ++){
            midVal1 = midVal2;
            if (tail1 < len1){
                midVal2 = nums1[tail1 ++];
            }else{
                midVal2 = nums2[tail2 ++];
            }
        }
        boolean needTwo = (len1 + len2) % 2 == 0;
        return needTwo ? (midVal1 + midVal2)/2.0f : midVal2;
    }
    public double findMedianInOneArrays(int[] nums) {
        int mid = nums.length >> 1;
        if (nums.length % 2 == 0){
            return (nums[mid] + nums[mid - 1]) / 2.0f;
        }
        return nums[mid];
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值