package com.interview.books.question300;
import com.interview.utils.ConsoleWriter;
/**
* Created_By: stefanie
* Date: 14-12-12
* Time: 下午10:26
*/
public class TQ1_MinDistanceTriplet {
public int minDistance(int[] A, int[] B, int[] C, int[] result){
if(A.length == 0 || B.length == 0 || C.length == 0) return Integer.MAX_VALUE;
int[] idx = new int[3];
boolean[] ended = new boolean[3];
int[] cur = new int[3];
cur[0] = A[0];
cur[1] = B[0];
cur[2] = C[0];
int minDistance = Integer.MAX_VALUE;
while(true){
int distance = distance(cur);
if(distance < minDistance){
minDistance = distance;
for(int i = 0; i < 3; i++) result[i] = cur[i];
}
int smallest = min(cur, ended);
if(smallest == -1) break;
idx[smallest]++;
switch (smallest){
case 0: if(idx[0] >= A.length) ended[0] = true;
else cur[0] = A[idx[0]];
break;
case 1: if(idx[1] >= B.length) ended[1] = true;
else cur[1] = B[idx[1]];
break;
case 2: if(idx[2] >= C.length) ended[2] = true;
else cur[2] = C[idx[2]];
break;
}
}
return minDistance;
}
public int distance(int[] array){
int distance = Integer.MIN_VALUE;
for(int i = 0; i < array.length; i++){
for(int j = i + 1; j < array.length; j++){
distance = Math.max(distance, Math.abs(array[i] - array[j]));
}
}
return distance;
}
public int min(int[] array, boolean[] ended){
int min = -1;
for(int i = 0; i < array.length; i++){
if(!ended[i] && (min == -1 || array[i] < array[min])) min = i;
}
return min;
}
public static void main(String[] args){
TQ1_MinDistanceTriplet finder = new TQ1_MinDistanceTriplet();
int[] A = new int[]{1,5,7};
int[] B = new int[]{3,5,12};
int[] C = new int[]{4,9,10};
int[] result = new int[3];
int minDistance = finder.minDistance(A, B, C, result);
System.out.println(minDistance);
ConsoleWriter.printIntArray(result);
}
}