My question is with reference to Method 2 of this link. Here two equal length sorted arrays are given and we have to find the median of the two arrays merged.
For variable length you just have to check the special cases when either of the array is having only 1 element in each level of recursion . If one of them such , don't divide further just pass it as it is till the other one also becomes of length 2. While giving final answer handle the case when one of them is having only 1 element.
//Median of two sorted arrays
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception {
int[] A = {1, 3, 11};
int[] B = {2, 4, 12, 14, 15};
System.out.println("Ans. "+findMedian(A, B));
//System.out.println(median(A));
}
private static int findMedian(int[] A, int[] B) {
System.out.println(Arrays.toString(A)+" --- "+ Arrays.toString(B));
int sA = A.length;
int sB = B.length;
if(sA <= 2 && sB <= 2) {
if(sA <= 1 && sA <= 1) {
return (A[0]+B[0])/2;
} else if(sA <= 1) {
return (max(A[0], B[0]) + min(A[0], B[1])) / 2;
} else if(sB <= 1) {
return (max(A[0], B[0]) + min(A[1], B[0]) ) / 2;
} else {
System.out.println("xxx");
return (max(A[0], B[0]) + min(A[1],B[1])) / 2;
}
}
int mA = median(A);
int mB = median(B);
if(mA == mB) {
return mA;
} else if(mA < mB) {
if(sA <= 2) {
return findMedian(A, Arrays.copyOfRange(B, 0, sB/2+1));
} else if(sB <= 2) {
return findMedian(Arrays.copyOfRange(A, sA/2, sA), B);
} else {
return findMedian(Arrays.copyOfRange(A, sA/2, sA)
,Arrays.copyOfRange(B, 0, sB/2+1));
}
} else {
if(sA <= 2) {
return findMedian(A, Arrays.copyOfRange(B, sB/2, sB));
} else if(sB <= 2) {
return findMedian(Arrays.copyOfRange(A, 0, sA/2+1),B);
} else {
return findMedian(Arrays.copyOfRange(A, 0, sA/2+1)
,Arrays.copyOfRange(B, sB/2, sB));
}
}
}
private static int median(int[] A) {
int size = A.length;
if(size == 0 ){
return 0;
} else if(size == 1) {
return A[0];
}
if(size%2 == 0 ) {
return (A[size/2 -1 ] + A[size/2 ])/2;
}else {
return A[size/2];
}
}
private static int max(int a, int b) {
return a > b ? a : b;
}
private static int min(int a, int b) {
return a < b ? a : b;
}
}