思路总结
: 如果两个数组的中位数 mid1 < mid2, 则说明合并后的中位数位于 num1.right + num2之间
否则合并后的中位数位于 nums2.right + nums1 之间 (right 是相对于 mid 而言的)
getKth 函数负责找到两个数组合并(假设)后有序的数组中的第 k 个元素, k 从 1 开始计算
/*
执行用时 :11 ms, 在所有 Java 提交中击败了94.59%的用户
内存消耗 :52.8 MB, 在所有 Java 提交中击败了69.72%的用户
寻找两个有序数组的中位数
*/
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
if(nums1==null&&nums2 ==null ){
return 0.0;
}
int m=nums1 .length ,n=nums2 .length ;
int l = (m+n+1) / 2;//左半部分最大的一个
int r = (m+n+2) / 2;//右半部分最小的一个
if(l==r){return findmid(nums1,0,nums2 ,0,l);}
return (findmid(nums1, 0, nums2, 0, l)+findmid(nums1, 0, nums2, 0, r))/2;
}
public static double findmid (int []nums1,int i,int[]nums2,int j,int k){
//若一个数组已全部舍弃,则返回另一个数组中第k个元素
if(i>nums1 .length -1)return nums2 [j+k-1];
if(j>nums2 .length -1)return nums1 [i+k-1];
if(k==1)return Math.min(nums1[i], nums2[j]);
int mid1 = Integer.MAX_VALUE;
int mid2 = Integer.MAX_VALUE;
//在nums1和nums2中判断要舍弃的部分,
if(i + k/2 - 1 < nums1.length) mid1 = nums1[i+ k/2 - 1];
if(j + k/2 - 1 < nums2.length) mid2 = nums2[j+ k/2 - 1];
// mid1 < mid2 在 nums1.right 和 nums2 之间搜索, 丢掉 k/2 个数.
if(mid1 < mid2)
return findmid(nums1, i + k/2, nums2, j, k - k/2) ;
else
return findmid(nums1, i, nums2, j + k/2, k - k/2) ;
}