[Algo] Optimal Utilization

Given 2 lists a and b. Each element is a pair of integers where the first integer represents the unique id and the second integer represents a value. Your task is to find an element from a and an element form b such that the sum of their values is less or equal to target and as close to target as possible. Return a list of ids of selected elements. If no pair is possible, return an empty list.

Example 1:

Input:
a = [[1, 2], [2, 4], [3, 6]] b = [[1, 2]] target = 7 Output: [[2, 1]] Explanation: There are only three combinations [1, 1], [2, 1], and [3, 1], which have a total sum of 4, 6 and 8, respectively. Since 6 is the largest sum that does not exceed 7, [2, 1] is the optimal pair. 

Example 2:

Input:
a = [[1, 3], [2, 5], [3, 7], [4, 10]]
b = [[1, 2], [2, 3], [3, 4], [4, 5]]
target = 10

Output: [[2, 4], [3, 2]]

Explanation:
There are two pairs possible. Element with id = 2 from the list `a` has a value 5, and element with id = 4 from the list `b` also has a value 5. Combined, they add up to 10. Similarily, element with id = 3 from `a` has a value 7, and element with id = 2 from `b` has a value 3. These also add up to 10. Therefore, the optimal pairs are [2, 4] and [3, 2]. 

Example 3:

Input:
a = [[1, 8], [2, 7], [3, 14]]
b = [[1, 5], [2, 10], [3, 14]]
target = 20

Output: [[3, 1]]

Example 4:

Input:
a = [[1, 8], [2, 15], [3, 9]]
b = [[1, 8], [2, 11], [3, 12]]
target = 20

Output: [[1, 3], [3, 2]]


    public static List<int[]> getOptimal(List<int[]> aList, List<int[]> bList, int target) {
        List<int[]> res = new ArrayList<>();
        int max = Integer.MIN_VALUE;
        Collections.sort(aList, ((a, b) -> a[1] - b[1]));
        Collections.sort(bList, ((a, b) -> a[1] - b[1]));
        int i = 0, j = bList.size() - 1;
        for (int[] arr : bList) {
            System.out.print(Arrays.toString(arr));
        }
        while (i < aList.size() && j >= 0) {
            int sum = aList.get(i)[1] + bList.get(j)[1];
            if (sum > target) {
                j -= 1;
            } else {
                if (sum > max) {
                    // need to update sum
                    max = sum;
                    res.clear();
                }
                res.add(new int[] {aList.get(i)[0], bList.get(j)[0]});
                int index = j - 1;
                System.out.println("j: " + j);
                System.out.println("index: " + index);
                while (index >= 0 && bList.get(index)[1] == bList.get(index + 1)[1]) {
                    res.add(new int[] {aList.get(i)[0], bList.get(index)[0]});
                    index -= 1;
                }
                i += 1;
            }
        }
        return res;
    }

猜你喜欢

转载自www.cnblogs.com/xuanlu/p/12640374.html