最基本的方法先按生序合并数组再查找;更好的方法是利用递归算法,如下记录。
两个有序数组a、b中找到第k小的数字:比较a[k/2-1]和b[k/2-1],即分别有k/2个数字比被比较的这两个数字更小,如果a[k/2-1]a[k/2-1]比所有数中第k小的数还要小,从而可以把a数组中第一位到被该位全部剔除,再在新数组a'和b数组中递归查找第(k-k/2)小的数字。
注意:递归过程中k/2可能会大于某一数组的长度,要分类处理,规避数组越界。
关于边界处理:分两种情况,a或b数组有一个为空;a和b数组都非空且k为1。
double findKth(int* a, int len1, int* b, int len2, int k){
int mid1 = (k/2) < len1 ? (k/2) : len1;
int mid2 = (k/2) < len2 ? (k/2) : len2;
if(len1 == 0)
return b[k - 1];
if(len2 == 0)
return a[k - 1];
if(k == 1)
return a[0] < b[0] ? a[0] : b[0];
if(a[mid1 - 1] <= b[mid2 - 1])
return findKth(a + mid1, len1 - mid1, b, len2, k - mid1);
else
return findKth(a, len1, b + mid2, len2 - mid2, k - mid2);
}
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
int k = nums1Size + nums2Size;
if(k % 2 == 1)
return findKth(nums1, nums1Size, nums2, nums2Size, k/2 + 1);
else
return (findKth(nums1, nums1Size, nums2, nums2Size, k/2 + 1) +
findKth(nums1, nums1Size, nums2, nums2Size, k/2)) / 2.0;
}