力扣4. 寻找两个正序数组的中位数 java

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

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

代码
class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int m=nums1.length;
        int n=nums2.length;
        int k=(m+n)/2;
        if((m+n)%2!=0){
            return (double)find(nums1,nums2,k+1);
        }else{
            return ((double)find(nums1, nums2, k) + (double)find(nums1, nums2, k+1)) / 2;
        }
    }
    public int find(int[] nums1,int[] nums2,int k){
        if(nums1==null || nums1.length==0){
            return nums2[k-1];
        }
        if(nums2==null || nums2.length==0){
            return nums1[k-1];
        }
        //l1和l2分别记录数组1和数组2中已经排除的元素的个数!!!,那么nums1[l1]和nums2[l2]就是目前
        //两个数组中未被排除元素中的第一个元素!!!(注意:这个很重要)
    int l1=0,l2=0;
        //当k>1时需要排除前k-1个元素
        while(k>1){
            //index1和index2分别表示数组1和数组2中未被排除元素中第k / 2 - 1个元素
            int index1=Math.min(l1+k/2-1,nums1.length-1);
            int index2=Math.min(l2+k/2-1,nums2.length-1);
            //当数组1中第k / 2 - 1个元素小于数组2中第k / 2 - 1个元素个元素的时候
            if(nums1[index1]<nums2[index2]){
                k=k-(index1-l1)-1;//排除数组1中前k/2个元素
                l1=index1+1;
            }else if(nums1[index1]>=nums2[index2]){
                k=k-(index2-l2)-1;
                l2=index2+1;
            }
            //当数组1的元素都被排除完之后,直接返回数组2中没有排除元素中的第k个元素!!!
            if(l1==nums1.length){
                return nums2[l2+k-1];
            }
            if(l2==nums2.length){
                return nums1[l1+k-1];
            }
        }
        //跳出循环,此时k=1
        return Math.min(nums1[l1],nums2[l2]);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值