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

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

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

示例 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
示例 3:

输入:nums1 = [0,0], nums2 = [0,0]
输出:0.00000
示例 4:

输入:nums1 = [], nums2 = [1]
输出:1.00000
示例 5:

输入:nums1 = [2], nums2 = []
输出:2.00000

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        // 将较小长度的数组换为nums1,方便后续操作
        if(nums1.length > nums2.length) {
            int tmp[] = nums1;
            nums1 = nums2;
            nums2 = tmp;
        }
        
        int len1 = nums1.length, len2 = nums2.length;
        
        // 确定左右边界
        int l = 0, r = len1;
        
        // 确定分割线左边的个数,长度和为奇数时设定分割线左边比右边多一位数
        int totalLeft = (len1 + len2 + 1) / 2;
        
        // 二分查找分割线
        while(l < r) {
            int mid = l + (r - l + 1) / 2;  // +1防止进入死循环并且防止数组越界
            int j = totalLeft - mid;
            if(nums1[mid - 1] > nums2[j]) {
                r = mid - 1;
            } else {
                l = mid;
            }
        }
        
        // 比较两个数组分割线左右两边数值
        // 此时i代表分割线在nums1右边的第一个数,j代表分割线在nums2右边的第一个数
        int i = l, j = totalLeft - l;
        int nums1Left = i == 0 ? Integer.MIN_VALUE : nums1[i - 1];
        int nums2Left = j == 0 ? Integer.MIN_VALUE : nums2[j - 1];
        int nums1Right = i == len1 ? Integer.MAX_VALUE : nums1[i];
        int nums2Right = j == len2 ? Integer.MAX_VALUE : nums2[j];
        
        if((len1 + len2) % 2 == 1) {
            return Math.max(nums1Left, nums2Left);
        } else {
            return (double)(Math.max(nums1Left, nums2Left) + Math.min(nums2Right, nums1Right)) / 2;
        }
        
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值