Problem:
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)).
My code:
public class Solution {
public double findMedianSortedArrays(int A[], int B[]) {
int m=A.length;
int n=B.length;
if((m+n)/2*2!=(m+n)) return helper(A, 0, m-1, B, 0, n-1, (m+n)/2+1);
else
return (helper(A, 0, m-1, B, 0, n-1, (m+n)/2)+helper(A, 0, m-1, B, 0, n-1, (m+n)/2+1))/2;
}
double helper(int A[], int AL, int AH, int B[], int BL, int BH, int k){
if(AH-AL>BH-BL){
return helper(B, BL, BH, A, AL, AH, k);
}
if(AL>AH) return B[k-1];
if(k==1) return Math.min(A[AL],B[BL]);
int m=AH-AL+1;
int n=BH-BL+1;
int a = Math.min(k/2, m);
int b = k- a;
if(A[AL+a-1]==B[BL+b-1]) return A[AL+a-1];
if(A[AL+a-1]<B[BL+b-1]) return helper(A, AL+a, AH, B, BL, BL+b-1, k-a);
else return helper(A, AL, AL+a-1, B, BL+b, BH, k-b);
}
}
idea:
把问题1:"寻找新的两个序列的第k个" 转化为问题2:"寻找新的两个序列的第k'个"。
为方便recursion,问题2中新的两个子序列设计为问题1的两个序列的子序列。为加快叠代,新k'设置为k/2
Array技巧:只记忆index, 不记忆子序列.
k表示ordering:"第几个",而不是index.