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)).
method 1, time complexity = O(max{m,n})
public class Solution {
public double findMedianSortedArrays(int A[], int B[]) {
double result = 0;
if(A.length != 0 || B.length != 0){
if(A.length == 0)
result = (B[(B.length - 1)/2] + B[B.length/2]) / 2.0;
if(B.length == 0)
result = (A[(A.length - 1)/2] + A[A.length/2]) / 2.0;
int length = A.length + B.length;
int[] total = new int[length];
int index1 = 0;
int index2 = 0;
for(int i = 0; i < length / 2 + 1; ++ i){
if(index1 < A.length && index2 < B.length){
if(A[index1] <= B[index2]){
total[i] = A[index1];
++index1;
}
else{
total[i] = B[index2];
++index2;
}
}
else if(index1 == A.length){
total[i] = B[index2];
++index2;
}
else{
total[i] = A[index1];
++index1;
}
}
result = (total[(length - 1)/2] + total[length /2]) / 2.0;
}
return result;
}
}
The O(log(m + n)) method
public class Solution {
public double findMedianSortedArrays(int A[], int B[]) {
int alen = A.length, blen = B.length;
if((alen + blen) % 2 != 0) //odd number of elements in total
return findHelper(A, B, (alen + blen) / 2 + 1, 0, alen - 1, 0, blen - 1);
else //even number of elements in total
return (findHelper(A, B, (alen + blen) / 2, 0, alen - 1, 0, blen - 1)
+ findHelper(A, B, (alen + blen) / 2 + 1, 0, alen - 1, 0, blen - 1)) / 2.0;
}
private int findHelper(int A[], int B[], int k, int startA, int endA, int startB, int endB){
if(endA < startA)
return B[startB + k - 1];
if(endB < startB)
return A[startA + k - 1];
if(k == 1)
return Math.min(A[startA], B[startB]);
int lenA = endA - startA + 1;
int lenB = endB - startB + 1;
if(lenA > lenB)
return findHelper(B, A, k, startB, endB, startA, endA);
else {
int aMid = Math.min(k / 2, lenA);
int bMid = k - aMid;
if(A[startA + aMid - 1] < B[startB + bMid - 1])
return findHelper(A, B, k - aMid, startA + aMid, endA, startB, endB);
else if(A[startA + aMid - 1] > B[startB + bMid - 1])
return findHelper(A, B, k - bMid, startA, endA, startB + bMid, endB);
else //A[startA + aMid - 1] == B[startB + bMid - 1]
return A[startA + aMid - 1];
}
}
}