题目
分析
寻找两个有序数组的中位数其实就想等价于寻找两个有序数组的第k个元素,k=(m+n)/2 + 1 (总元素个数为奇数的情况)
//查询两个有序数组中的第k个元素,k是从1开始计算的
public int findKth(int[] A,int abegin,int aend,int[] B,int bbegin,int bend,int k) {
int lenA = aend - abegin + 1;
int lenB = bend - bbegin + 1;
if(lenA == 0) {
return B[bbegin + k - 1];
}
if(lenB == 0) {
return A[abegin + k - 1];
}
if(k == 1) {
return A[abegin] > B[bbegin] ? B[bbegin]:A[abegin];
}
//这里k / 2可能会超出其中一个数组的长度
int j = abegin + Math.min(lenA,k / 2) - 1;
int i = bbegin + Math.min(lenB,k / 2) -1;
if(A[j] > B[i]) {//如果A[j]>B[i],那么第k个元素肯定不会出现在B[bbegin,i]之间,所以把这段元素排除在外
return findKth(A,abegin,aend,B,i + 1,bend,k - (i - bbegin + 1));
} else {
return findKth(A,j + 1 ,aend,B,bbegin,bend,k - (j-abegin + 1));
}
}
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int n = nums1.size();
int m = nums2.size();
//这里是为了统一m+n的奇偶问题
int left = (m+n+1)/2;
int right = (m+n+2)/2;
return (findKth(nums1,0,n-1,nums2,0,m-1,left)+getMid(nums1,0,n-1,nums2,0,m-1,right))*0.5;
}