Inversion graphs

You are given an array A with N elements. You create a graph G with N vertices using A as follows:

For any pair of indices (i, j) where 1i<jN, if A[i]>A[j], then add an undirected edge between vertices i and j.

In graph G, find the maximum possible size of set S (of vertices in G) such that there exists an edge between every pair of vertices that are available in S.

Example:

Input: n=3, arr=[2,1,3]
Output: 2

Approach

Java

import java.util.Arrays;

public class InversionGraphs {
    public static void main(String args[]) {

        int len = 3;
        int array[] = { 213 };

        int result = inversionGraphs(len, array);
        System.out.println(result);
    }

    private static int inversionGraphs(int lenint[] array) {
        if (array == null || len < 2)
            return len;
        int[] indices = new int[len + 1];
        Arrays.fill(indices, -1);
        int length = 0;
        for (int i = 0; i < len; i++) {
            int newLength = binarySearch(1, length, indices, array, array[i]);
            indices[newLength] = i;
            length = Math.max(length, newLength);
        }
        return length;
    }

    private static int binarySearch(int startIdxint endIdxint indices[], int array[], int num) {
        if (startIdx > endIdx)
            return startIdx;
        int middleIdx = startIdx + (endIdx - startIdx) / 2;
        if (array[indices[middleIdx]] > num) {
            startIdx = middleIdx + 1;
        } else {
            endIdx = middleIdx - 1;
        }
        return binarySearch(startIdx, endIdx, indices, array, num);
    }
}


No comments:

Post a Comment