/* package whatever; // don't place package name! */
class MedianOfTwoArrays {
public static void main
(String[] args
) { // Note: These are sorted arrays and are of equal length.
int[] array1 = {1, 3, 5, 7, 9, 11}; // median is 6
int[] array2 = {2, 4, 6, 8, 10, 12};
int median = getMedianOfTwoArrays(array1, array2);
}
static int getMedianOfTwoArrays(int[] array1, int[] array2) {
int index1 = array1.length/2;
int index2 = array2.length/2;
int m1 = array1[index1];
int m2 = array2[index2];
if(m1 == m2) {
return m1;
} else {
return findMedian(array1, array2, 0, array1.length - 1, 0, array2.length - 1);
}
}
static int findMedian(int[] array1,
int[] array2,
int low1,
int high1,
int low2,
int high2) {
// termination condition
if((high1 - low1 + 1) == 2 && (high2 - low2 + 1) == 2) {
return (Math.
max(array1
[low1
], array2
[low2
]) + Math.
min(array1
[high1
], array2
[high2
]))/2; }
assert (high2-low2==high1-low1); // sanity check
int n=high1-low1+1; // "n" from logic
int m1 = median(array1,low1,high1);
int m2 = median(array2,low2,high2);
System.
out.
println("Median 1:"+m1
); System.
out.
println("Median 2:"+m2
);
int low1_t = 0;
int high1_t = 0;
int low2_t = 0;
int high2_t = 0;
if(m1 == m2) {
return m1;
} else if(m1 > m2) {
if (n % 2 == 0) {
low1_t = low1;
high1_t = high1-n/2+1;
low2_t = low2+n/2-1;
high2_t = high2;
} else {
low1_t = low1;
high1_t = high1-n/2;
low2_t = low2+n/2;
high2_t = high2;
}
} else {
if (n % 2 == 0) {
low1_t = low1+n/2-1;
high1_t = high1;
low2_t = low2;
high2_t = high2-n/2+1;
} else {
low1_t = low1+n/2;
high1_t = high1;
low2_t = low2;
high2_t = high2-n/2;
}
}
return findMedian(array1, array2, low1_t, high1_t, low2_t, high2_t);
}
static int median(int[] arr, int low,int hig)
{
if ((low+hig)%2 == 0) return arr[(low+hig)/2];
int mid=(low+hig)/2;
return (arr[mid]+ arr[mid-1])/2;
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKY2xhc3MgTWVkaWFuT2ZUd29BcnJheXMgewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewoJCS8vIE5vdGU6IFRoZXNlIGFyZSBzb3J0ZWQgYXJyYXlzIGFuZCBhcmUgb2YgZXF1YWwgbGVuZ3RoLgoJCgkJaW50W10gYXJyYXkxID0gezEsIDMsIDUsIDcsIDksIDExfTsgLy8gbWVkaWFuIGlzIDYKCQlpbnRbXSBhcnJheTIgPSB7MiwgNCwgNiwgOCwgMTAsIDEyfTsKCgoJCWludCBtZWRpYW4gPSBnZXRNZWRpYW5PZlR3b0FycmF5cyhhcnJheTEsIGFycmF5Mik7CgkJU3lzdGVtLm91dC5wcmludGxuKG1lZGlhbik7Cgl9CgoJc3RhdGljIGludCBnZXRNZWRpYW5PZlR3b0FycmF5cyhpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MikgewoJCWludCBpbmRleDEgPSBhcnJheTEubGVuZ3RoLzI7CgkJaW50IGluZGV4MiA9IGFycmF5Mi5sZW5ndGgvMjsKCgkJaW50IG0xID0gYXJyYXkxW2luZGV4MV07CgkJaW50IG0yID0gYXJyYXkyW2luZGV4Ml07CgoJCWlmKG0xID09IG0yKSB7CgkJCXJldHVybiBtMTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZmluZE1lZGlhbihhcnJheTEsIGFycmF5MiwgMCwgYXJyYXkxLmxlbmd0aCAtIDEsIDAsIGFycmF5Mi5sZW5ndGggLSAxKTsKCQl9Cgl9CgoJc3RhdGljIGludCBmaW5kTWVkaWFuKGludFtdIGFycmF5MSwgCgkJCQkJCQlpbnRbXSBhcnJheTIsCgkJCQkJCQkJaW50IGxvdzEsIAoJCQkJCQkJCQlpbnQgaGlnaDEsCgkJCQkJCQkJCQlpbnQgbG93MiwgCgkJCQkJCQkJCQkJaW50IGhpZ2gyKSB7CgkJLy8gdGVybWluYXRpb24gY29uZGl0aW9uCgkJU3lzdGVtLm91dC5wcmludChsb3cxKTsgU3lzdGVtLm91dC5wcmludChoaWdoMSk7U3lzdGVtLm91dC5wcmludChsb3cyKTtTeXN0ZW0ub3V0LnByaW50bG4oaGlnaDIpOwoJCWlmKChoaWdoMSAtIGxvdzEgKyAxKSA9PSAyICYmIChoaWdoMiAtIGxvdzIgKyAxKSA9PSAyKSB7CgkJCXJldHVybiAoTWF0aC5tYXgoYXJyYXkxW2xvdzFdLCBhcnJheTJbbG93Ml0pICsgTWF0aC5taW4oYXJyYXkxW2hpZ2gxXSwgYXJyYXkyW2hpZ2gyXSkpLzI7CgkJfQoKCQkKICAgICAgICBhc3NlcnQgKGhpZ2gyLWxvdzI9PWhpZ2gxLWxvdzEpOyAvLyBzYW5pdHkgY2hlY2sKICAgICAgICBpbnQgbj1oaWdoMS1sb3cxKzE7IC8vICJuIiBmcm9tIGxvZ2ljCiAgICAgICAgCiAgICAgICAgaW50IG0xID0gbWVkaWFuKGFycmF5MSxsb3cxLGhpZ2gxKTsKICAgICAgICBpbnQgbTIgPSBtZWRpYW4oYXJyYXkyLGxvdzIsaGlnaDIpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigiTWVkaWFuIDE6IittMSk7CgkJU3lzdGVtLm91dC5wcmludGxuKCJNZWRpYW4gMjoiK20yKTsKCQkKICAgICAgICBpbnQgbG93MV90ID0gMDsKICAgICAgICBpbnQgaGlnaDFfdCA9IDA7CiAgICAgICAgaW50IGxvdzJfdCA9IDA7CiAgICAgICAgaW50IGhpZ2gyX3QgPSAwOwoKICAgICAgICBpZihtMSA9PSBtMikgewogICAgICAgICAgICByZXR1cm4gbTE7CiAgICAgICAgfSBlbHNlIGlmKG0xID4gbTIpIHsKICAgICAgICAgICAgaWYgKG4gJSAyID09IDApIHsKICAgICAgICAgICAgICAgIGxvdzFfdCA9IGxvdzE7CiAgICAgICAgICAgICAgICBoaWdoMV90ID0gaGlnaDEtbi8yKzE7CiAgICAgICAgICAgICAgICBsb3cyX3QgPSBsb3cyK24vMi0xOwogICAgICAgICAgICAgICAgaGlnaDJfdCA9IGhpZ2gyOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbG93MV90ID0gbG93MTsKICAgICAgICAgICAgICAgIGhpZ2gxX3QgPSBoaWdoMS1uLzI7CiAgICAgICAgICAgICAgICBsb3cyX3QgPSBsb3cyK24vMjsKICAgICAgICAgICAgICAgIGhpZ2gyX3QgPSBoaWdoMjsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChuICUgMiA9PSAwKSB7CiAgICAgICAgICAgICAgICBsb3cxX3QgPSBsb3cxK24vMi0xOwogICAgICAgICAgICAgICAgaGlnaDFfdCA9IGhpZ2gxOwogICAgICAgICAgICAgICAgbG93Ml90ID0gbG93MjsKICAgICAgICAgICAgICAgIGhpZ2gyX3QgPSBoaWdoMi1uLzIrMTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGxvdzFfdCA9IGxvdzErbi8yOwogICAgICAgICAgICAgICAgaGlnaDFfdCA9IGhpZ2gxOwogICAgICAgICAgICAgICAgbG93Ml90ID0gbG93MjsKICAgICAgICAgICAgICAgIGhpZ2gyX3QgPSBoaWdoMi1uLzI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZpbmRNZWRpYW4oYXJyYXkxLCBhcnJheTIsIGxvdzFfdCwgaGlnaDFfdCwgbG93Ml90LCBoaWdoMl90KTsKCX0KCXN0YXRpYyBpbnQgbWVkaWFuKGludFtdIGFyciwgaW50IGxvdyxpbnQgaGlnKSAKCXsKCQlpZiAoKGxvdytoaWcpJTIgPT0gMCkgcmV0dXJuIGFyclsobG93K2hpZykvMl07CgkJaW50IG1pZD0obG93K2hpZykvMjsKCQlyZXR1cm4gKGFyclttaWRdKyBhcnJbbWlkLTFdKS8yOwoJfQp9