package me.ramswaroop.arrays;
import java.util.Arrays;
/**
* Created by IntelliJ IDEA.
*
* @author: ramswaroop
* @date: 7/27/15
* @time: 5:50 PM
*/
public class MedianOfTwoSortedArrays {
/**
* Returns the median of a sorted array {@param a}.
*
* @param a
* @return
*/
public static int median(int a[]) {
int l = a.length;
if (l % 2 == 0) {
return (a[l / 2] + a[l / 2 - 1]) / 2;
} else {
return a[l / 2];
}
}
/**
* Returns the median of two sorted arrays {@param a1} and {@param a2} having same length.
* In case of any error, it returns {@code -1}.
* <p/>
* Example:
* <p/>
* <p/>
* ar1[] = {1, 12, 15, 26, 38}
* ar2[] = {2, 13, 17, 30, 45}
* For above two arrays m1 = 15 and m2 = 17
* <p/>
* For the above ar1[] and ar2[], m1 is smaller than m2. So median is present in one of
* the following two sub-arrays:
* <p/>
* [15, 26, 38] and [2, 13, 17]
* Let us repeat the process for above two sub-arrays:
* <p/>
* m1 = 26 m2 = 13.
* m1 is greater than m2. So the sub-arrays become
* <p/>
* [15, 26] and [13, 17]
* Now size is 2, so median = (max(ar1[0], ar2[0]) + min(ar1[1], ar2[1]))/2
* = (max(15, 13) + min(26, 17))/2
* = (15 + 17)/2
* = 16
*
* @param a1
* @param a2
* @return
*/
public static int median(int[] a1, int[] a2) {
int l1 = a1.length, l2 = a2.length, m1, m2;
if (l1 != l2 || l1 <= 0) {
return -1;
}
if (l1 == 1) {
return (a1[0] + a2[0]) / 2;
}
if (l1 == 2) {
return (Math.max(a1[0], a2[0]) + Math.min(a1[1], a2[1])) / 2;
}
m1 = median(a1);
m2 = median(a2);
if (m1 == m2) {
return m1;
}
if (m1 < m2) { // median exists in a1[m1....] and a2[....m2]
if (l1 % 2 == 0) {
return median(Arrays.copyOfRange(a1, l1 / 2 - 1, l1), Arrays.copyOfRange(a2, 0, l2 / 2 + 1));
} else {
return median(Arrays.copyOfRange(a1, l1 / 2, l1), Arrays.copyOfRange(a2, 0, l2 / 2 + 1));
}
} else {
if (l1 % 2 == 0) { // median exists in a1[....m1] and a2 [m2....]
return median(Arrays.copyOfRange(a1, 0, l1 / 2 + 1), Arrays.copyOfRange(a2, l2 / 2 - 1, l2));
} else {
return median(Arrays.copyOfRange(a1, 0, l1 / 2 + 1), Arrays.copyOfRange(a2, l2 / 2, l2));
}
}
}
public static void main(String a[]) {
// test cases
System.out.println(median(new int[]{1, 2, 3, 6}, new int[]{4, 6, 8, 9}));
System.out.println(median(new int[]{4, 6, 8, 9}, new int[]{1, 2, 3, 6}));
System.out.println(median(new int[]{1, 2}, new int[]{3, 4}));
System.out.println(median(new int[]{2, 2}, new int[]{2, 2}));
}
}