package com.interview.books.question300;
import com.interview.utils.ArrayUtil;
import com.interview.utils.ConsoleWriter;
import java.util.Arrays;
/**
* Created by stefanie on 1/21/15.
*/
public class TQ54_SwitchBalancer {
public void switchPair(int[] A, int[] B){
int sumA = ArrayUtil.sum(A, 0, A.length - 1);
int sumB = ArrayUtil.sum(B, 0, B.length - 1);
int minGap = Integer.MAX_VALUE;
int idxA = -1;
int idxB = -1;
Arrays.sort(A);
for(int i = 0; i < B.length; i++){
int target = (sumA - sumB + 2 * B[i])/2;
int closest = closest(A, target);
int cur = Math.abs(sumA - sumB - 2 * A[closest] + 2 * B[i]);
if(cur < minGap){
minGap = cur;
idxA = closest;
idxB = i;
}
}
int temp = A[idxA];
A[idxA] = B[idxB];
B[idxB] = temp;
}
public int closest(int[] A, int target){
int low = 0;
int high = A.length;
while(low < high){
int mid = low + (high - low)/2;
if(A[mid] == target) return mid;
else if(target < A[mid]) high = mid;
else low = mid + 1;
}
if(low > 0 && Math.abs(A[low - 1] - target) < Math.abs(A[low] - target)) return low - 1;
else return low;
}
public static void main(String[] args){
int[] A = new int[]{1,7,8,4};
int[] B = new int[]{9,8,7,6};
TQ54_SwitchBalancer balancer = new TQ54_SwitchBalancer();
balancer.switchPair(A, B);
ConsoleWriter.printIntArray(A);
System.out.println(ArrayUtil.sum(A, 0, A.length - 1));
ConsoleWriter.printIntArray(B);
System.out.println(ArrayUtil.sum(B, 0, B.length - 1));
}
}