st0le
7/1/2013 - 11:13 PM

O(n^2 logn)/O(n^2) - Find Quads

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;
        }
    }