题目描述:
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
你可以假设 nums1 和 nums2 均不为空。
困难题,要求算法时间复杂度为O(log(m+n)),也就是最优方法
参考解法:https://blog.csdn.net/lxhpkm01/article/details/53823595
二分法查找,每次舍弃部分区间:
public static double findMedianSortedArrays(int A[], int B[]) {
if(A==null||B==null) return -1.0;
int m=A.length;
int n=B.length;
int len=m+n;
if((len&1)==0){
return (findK(A,0,m-1,B,0,n-1,len/2)+findK(A,0,m-1,B,0,n-1,len/2+1))/2.0;
}else{
return findK(A,0,m-1,B,0,n-1,len/2+1);
}
}
//k表示第k小,对应下标为k-1
public static int findK(int[] A,int startA,int endA,int[] B,int startB,int endB,int k){
int lenA=endA-startA+1;
int lenB=endB-startB+1;
if(lenA<=0&&lenB>0){
return B[startB+k-1];
}else if(lenB<=0&&lenA>0){
return A[startA+k-1];
}
if(lenA>lenB) {
return findK(B,startB,endB,A,startA,endA,k);
}
if(k==1) {
return Math.min(A[startA],B[startB]);
}
int ka=Math.min(lenA,k/2);
int kb=k-ka;
if(A[startA+ka-1]==B[startB+kb-1]){
return A[startA+ka-1];
}else if(A[startA+ka-1]<B[startB+kb-1]){
return findK(A,startA+ka,endA,B,startB,startB+kb-1,k-ka);
}else{
return findK(A,startA,startA+ka-1,B,startB+kb,endB,k-kb);
}
}