public class Solution {
public double findMedianSortedArrays(int A[], int B[]) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
if((A.length+B.length)%2==0){
return (findMedian(A,B,(A.length+B.length)/2)+findMedian(A,B,(A.length+B.length)/2+1))/2.0; //[1,1,3,3] and [1,1,3,3] kLeft=4 kRight=5, calculate median
}else{
return findMedian(A,B,(A.length+B.length)/2+1);[1,1,3] and [1,1,3,3] k=7/2=3, the 4th one
}
}
private double findMedian(int[] a,int[] b,int k){
if(a.length<=0)return b[k-1]; //because the k is kth number, so should be k-1
if(b.length<=0)return a[k-1];
if(k<=1)return Math.min(a[0],b[0]);
if(a[a.length/2]>b[b.length/2]){
if(a.length/2+b.length/2>=k-1){ //这的等于和下面的-1,+1很重要
return findMedian(Arrays.copyOfRange(a,0,a.length/2),b,k); //0-a.length/2 一共a.length/2+1个,因为a.length/2在这里 所以上面要有等于
}else{
return findMedian(a,Arrays.copyOfRange(b,b.length/2+1,b.length),k-b.length/2-1); //a.length/2+1 - a.length-1
}
}else{
if(a.length/2+b.length/2>=k-1){
return findMedian(a,Arrays.copyOfRange(b,0,b.length/2),k);
}else{
return findMedian(Arrays.copyOfRange(a,a.length/2+1,a.length),b,k-a.length/2-1);
}
}
}
}
其中要注意的是数组下标
由于A.length/2计算的是上界 比如[1,1,3,3] length/4=2 a[2]=3 所以都选用上界
k表示的是第k个数 从1开始 和length一样