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

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

解答1:

  

public static double findMedianSortedArrays(int[] nums1,int[] nums2){
    /*数组1的长度*/
    int m=nums1.length;
    /*数组2的长度*/
    int n=nums2.length;
    /*保持第一个数组的长度更小*/
    if(m>n){
      return findMedianSortedArrays(nums2,nums1);
    }
    /*定义'割'后的第一个数组左边最大值,右边最小值,第二个数组左边最大值,右边最小值*/
    double lMax1=0,lMax2=0,rMin1=0,rMin2=0;
    /*lo是二分法左边的点,hi是二分法右边的点,需要把m长度变成偶数,c1是数组1的割点,c2是数组2的割点*/
    int lo=0,hi=2*m,c1,c2;
    /*当左边的点小于等于右边的点时继续*/
    while (lo<=hi){
      /*获取数组1的割点*/
      c1=(lo+hi)/2;
      /*获取数组2的割*/
      c2=m+n-c1;
      lMax1=c1==0?Integer.MIN_VALUE:nums1[(c1-1)/2];
      rMin1=c1==2*m?Integer.MAX_VALUE:nums1[c1/2];
      lMax2=c2==0?Integer.MIN_VALUE:nums2[(c2-1)/2];
      rMin2=c2==2*n?Integer.MAX_VALUE:nums2[c2/2];
      if(lMax1>rMin2){
        hi=c1-1;
      }else if(lMax2>rMin1){
        lo=c1+1;
      }else {
        break;
      }

    }
    return (Math.max(lMax1,lMax2)+Math.min(rMin1,rMin2))/2;
  }
View Code

 

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays

posted @ 2019-11-14 00:24  有为吴  阅读(169)  评论(0编辑  收藏  举报