本题为在两个排序数组中找第K大的数的一个特殊情况——第(A.length+B.length)/2大的数。
使用并归的思想逐个比较找出满足要求的数的时间复杂度为O(N)。
使用二分法比较A[K/2-1]和B[K/2-1],并思考这两个元素和第k大元素的关系。
1.A[K/2-1] <= B[K/2-1],A和B合并后的第K大数中必包含A[0]~A[k/2-1],可用归并的思想去理解。
2.若k/2-1超出了A的长度,则必取B[0]~B[k/2-1]。
接下来考虑特殊情况:
1.A,B都为空,或一个为空。
2.A+B的长度为偶数时返回len/2和len.2+1的均值,为奇数时返回len/2+1处的值。
3.findFunc利用了递归的方法,判断递归条件的判断非常重要:可以利用极端情况时的参数来入手,即看[ ]A.[ ]B,k谁先达到了极端的情况。
import java.util.*;
public class Solution {
public double findMedianSortedArrays(int A[], int B[]) {
if(A == null||B == null||(A.length == 0 && B.length == 0))
return 0;
int len=A.length+B.length;
if(len%2 == 0)
return (findFunc(A,B,0,0,len/2)+findFunc(A,B,0,0,len/2+1))/2.0;
else
return findFunc(A,B,0,0,len/2+1);
}
public int findFunc(int[] A,int[] B,int A_start,int B_start,int k)
{
if(A_start >= A.length)
return B[B_start+k-1];
if(B_start >= B.length)
return A[A_start+k-1];
if(1 == k)
return Math.min(A[A_start],B[B_start]);
int A_value=A_start+k/2-1 >= A.length?Integer.MAX_VALUE:A[A_start+k/2-1];
int B_value=B_start+k/2-1 >= B.length?Integer.MAX_VALUE:B[B_start+k/2-1];
if(A_value < B_value)
return findFunc(A,B,A_start+k/2,B_start,k-k/2);
else
return findFunc(A,B,A_start,B_start+k/2,k-k/2);
}
}