O(n^2 logn)/O(n^2) - Find Quads
// Complexity - O(n^2 logn), Space Complexity - O(n^2)
private int[] findQuad_4(int[] A, int[] B, int[] C, int[] D) {
Integer[] AB = new Integer[A.length * B.length];
Integer[] CD = new Integer[C.length * D.length];
for (int i = 0, l = AB.length; i < l; i++) AB[i] = i;
for (int i = 0, l = CD.length; i < l; i++) CD[i] = i;
Arrays.sort(AB, new IndexComparator(A, B)); // O(n^2 logn)
Arrays.sort(CD, new IndexComparator(C, D)); // O(n^2 logn)
int left = 0, abl = AB.length, right = CD.length - 1;
int bl = B.length, dl = D.length;
while (left < abl && right >= 0) { // O(n^2)
int leftIndex = AB[left], rightIndex = CD[right];
int s = A[leftIndex / bl] + B[leftIndex % bl] + C[rightIndex / dl] + D[rightIndex % dl];
if (s == 0)
return new int[]{A[leftIndex / bl], B[leftIndex % bl], C[rightIndex / dl], D[rightIndex % dl]};
else if (s < 0)
left++;
else
right--;
}
return null;
}
private class IndexComparator implements Comparator<Integer> {
private int[] X, Y;
private int yl;
private IndexComparator(int[] x, int[] y) {
X = x;
Y = y;
yl = Y.length;
}
@Override
public int compare(Integer o1, Integer o2) {
return X[o1 / yl] + Y[o1 % yl] <= X[o2 / yl] + Y[o2 % yl] ? -1 : 1;
}
}