寻找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; }
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays