从两个数组中找出和小于最接近的目标的 id 对

原文:https://www . geeksforgeeks . org/从两个数组中找到最接近它的小于目标的 id 对/

给定两个尺寸分别为 NM 的形式为 {ID,value} 的对的阵列arr 1【】arr 2【】,以及一个整数目标,任务是从两个阵列中找到所有对的ID,使得对的值之和最大,并且最多具有值M

示例:

输入: arr1[] = [[1,2000],[2,3000],[3,2000]],arr2[] = [[1,2500],[2,3000],[3,3000]],target = 6000 输出: 2 2 2 3 解释: 以下是来自两个数组 arr1[]和的元素对

  • (arr1[2],arr2[2]): 元素 3000 + 3000 = 6000(=目标)之和,最接近值目标。将标识打印为(2,2)。
  • (arr1[2],arr2[3]): 元素 3000 + 3000 = 6000(=目标)之和,最接近值目标。将标识打印为(2,3)。

输入: arr1[] = [[1,2000],[2,3000],[3,2000]],arr2[] = [[1,3000],[2,3000]],目标= 5500 T3】输出:T5】1 1 1 1 2 3 1 3 2

方法:使用树形图数据结构存储数组元素arr 1【】并高效地为另一个数组arr 2【】中的每个元素找到配对,就可以解决给定的问题。以下是步骤:

  • 创建一个树形图,其中键是数组元素的值,值是标识列表
  • 迭代数组 arr1[] ,并将其元素插入树形图。
  • 初始化一个变量,说 closestTarget 来跟踪最接近目标的值,并且不超过它。
  • 初始化一个数组列表 结果来存储所有可能的 id 对。
  • 迭代数组 arr2[] ,并为每个元素计算要在树形图中搜索的剩余值。
  • 完成上述步骤后,打印数组列表结果[] 中存储的所有 id 对。

下面是上述方法的实现:

Java 语言(一种计算机语言,尤用于创建网站)

// Java program for the above approach

import java.io.*;
import java.util.*;

class GFG {

    // Function to find pairs of ids with
    // sum of values closest to the target
    // but not exceeding the target
    public static void closestPair(
        int[][] arr1, int[][] arr2, int target)
    {

        // Initialize TreeMap having array
        // element value as key and list of
        // ids as value in the TreeMap
        TreeMap<Integer, List<Integer> > valueToIds
            = new TreeMap<>();

        // list to store all answer pairs
        List<int[]> result = new ArrayList<>();

        // Keeps the track of maximum sum
        // of pair values not exceeding target
        int closestTarget = 0;

        // Iterate through the array arr1 and
        // add all elements in the TreeMap
        for (int[] a : arr1) {

            int val = a[1], id = a[0];
            valueToIds.putIfAbsent(
                val, new ArrayList<>());
            valueToIds.get(val).add(id);
        }

        for (int[] b : arr2) {

            // Find the corresponding value
            // to be found
            int remaining = target - b[1];

            if (remaining < 0)
                continue;

            // Find a value which is close to
            // desired value, not exceeding it
            Integer floor = valueToIds.floorKey(
                remaining);

            // No value found which is less
            // than or equal to floor
            if (floor == null)
                continue;

            int currentTarget = b[1] + floor;

            if (currentTarget >= closestTarget) {
                if (currentTarget > closestTarget) {

                    // Update closeTarget and reset
                    // result list
                    closestTarget = currentTarget;
                    result = new ArrayList<>();
                }

                // Add all possible pairs in
                // result list
                for (int id : valueToIds.get(floor))
                    result.add(
                        new int[] { id, b[0] });
            }
        }

        // Print all the id pairs
        for (int[] ans : result) {
            System.out.println(
                ans[0] + " " + ans[1]);
        }
    }

    // Driver Code
    public static void main(String[] args)
    {
        int[][] arr1
            = { { 1, 2000 }, { 2, 3000 }, { 3, 2000 } };
        int[][] arr2 = { { 1, 3000 },
                         { 2, 3000 } };
        int target = 5500;

        closestPair(arr1, arr2, target);
    }
}

Output:

1 1
3 1
1 2
3 2

时间复杂度:O(N * log N+M) T5辅助空间:* O(NM)