两个有序数组的中位数可以转化为---求两个有序数组的第t小的数
设i,j分别为nums1和nums2结果的索引位置,n为nums1长度,m为nums2长度。
满足条件为:
1、i+j=k
2、a[i-1]<=b[j]&&b[j-1]<=a[i]
需满足条件{ 0 < i < n 0 < j < m ---> 0 <k-i<m max(0,k-m) <i < min(n,k);
则可以根据i的该范围进行二分查找 查找条件需满足i的前一位nums1[i-1] < nums2[j] ,j的前一位nums2[j-1] < nums1[i]
@Test
public void test() {
int[] nums1 = new int[]{1,2,2};
int[] nums2 = new int[]{1,2,3};
findMedianSortedArrays(nums1,nums2);
}
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int n = nums1.length + nums2.length;
if (n % 2 == 0){
return (findMiddle(nums1, nums2, n>>1) + findMiddle(nums1, nums2, (n>>1)+1)) / 2.0;
} else {
return findMiddle(nums1, nums2, (n>>1)+1);
}
}
private int findMiddle(int[] nums1, int[] nums2, int k) {
if (k<=0 || k > (nums1.length + nums2.length)) {
return 0;
}
int le = Math.max(0,k-nums2.length);
int ri = Math.min(nums1.length,k);
while (le < ri) {
int m = le + (ri-le) / 2;
if (nums2[k - m - 1] > nums1[m]) {
le = m + 1;
} else {
ri = m;
}
}
int max1 = le == 0 ? Integer.MIN_VALUE : nums1[le - 1];
int max2 = le == k ? Integer.MIN_VALUE : nums2[k-le-1];
return Math.max(max1,max2);
}