1.median-of-two-sorted-arrays
There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
思路:两个数组找中位数我们可以转化成为找第k小。
我们首先找两个数组合起来的第k小,就是分别找两个数组分开的第k/2小。
假设两个数组是一样长的,那么就拿A[ast+k-1]与B[bst+k-1]比较,
如果A[ast+k-1]<B[bst+k-1]的话,那么A数组的第k/2小就不在ast~ast+k/2-1之间。
class _109{
public static final int inf=0x7FFFFFF;
public double findMedianSortedArrays(int A[], int B[]){
int total=A.length+B.length;
int t=total&1;
if(t==1){ //奇数个
return getKth(A,0,B,0,total/2+1); //奇数个个直接找第k小
}else{ //偶数个
return (getKth(A,0,B,0,total/2)+getKth(A,0,B,0,total/2+1))/2;//偶数个找第k小和第k+1小
}
}
public double getKth(int A[],int ast,int B[],int bst,int k){
if(ast>=A.length){ //超出范围说明A数组上已经不存在第k/2小的数了,那么答案就是b数组第k小的数。
return B[bst+k-1]; //第k/2是建立在两个数组都有数的情况下的,若只是一个数组,那么就是第k小
} //例如 {} {1,2,3}
if(bst>=B.length){ //同上
return A[ast+k-1];
}
if(k==1){ //如果为1,直接返回a,b数组ast,bst上的较小的值,临界
return Math.min(A[ast],B[bst]);
}
int aMid = inf,bMid = inf; //注意初始值
if(ast+k/2-1<A.length){ //找数组第k/2小的值进行比较
aMid=A[ast+k/2-1];
}
if(bst+k/2-1<B.length){
bMid=B[bst+k/2-1];
}
if(aMid<bMid){
return getKth(A,ast+k/2,B,bst,k-k/2); //舍弃a数组ast~ast+k/2-1部分
}else{
return getKth(A,ast,B,bst+k/2,k-k/2); //舍弃b数组bst~bst+k/2-1部分
}
}
public static void main(String[] args) {
int[] a={};
int[] b={1};
System.out.println(new _109().findMedianSortedArrays(a,b));
}
}