Encuentre los pares de ID de dos arrays que tengan una suma menor que el objetivo más cercano

Dadas dos arrays arr1[] y arr2[] de pares de la forma {ID, valor} de tamaño N y M respectivamente y un objetivo entero , la tarea es encontrar todos los pares de ID de ambas arrays de modo que la suma de los valores de los pares es máximo y tiene un valor como máximo M .

Ejemplos:

Entrada: arr1[] = [[1, 2000], [2, 3000], [3, 2000]], arr2[] = [[1, 2500], [2, 3000], [3, 3000]], destino = 6000
Salida:
2 2
2 3
Explicación:
Los siguientes son los pares de elementos de las dos arrays arr1[] y arr2[]:

  • (arr1[2], arr2[2]): La suma de los elementos 3000 + 3000 = 6000(= objetivo) y más cercano al valor objetivo. Imprima los ID como (2, 2).
  • (arr1[2], arr2[3]): La suma de los elementos 3000 + 3000 = 6000(= objetivo) y más cercano al valor objetivo. Imprima los ID como (2, 3).

Entrada: arr1[] = [[1, 2000], [2, 3000], [3, 2000]], arr2[] = [[1, 3000], [2, 3000]], destino = 5500 Salida
:
1 1
1 2
3 1
3 2

Enfoque: el problema dado se puede resolver utilizando la estructura de datos TreeMap para almacenar los elementos de la array arr1[] y encontrar eficientemente el par para cada elemento en la otra array arr2[] . A continuación se muestran los pasos:

  • Cree un TreeMap donde la clave es el valor del elemento de la array y el valor es la lista de ID .
  • Itere la array arr1[] e inserte sus elementos en el TreeMap.
  • Inicialice una variable, diga el objetivo más cercano para realizar un seguimiento del valor más cercano al objetivo y no excederlo.
  • Inicialice un resultado de ArrayList para almacenar todos los posibles pares de ID.
  • Itere la array arr2[] y para cada elemento calcule el valor restante que se buscará en el TreeMap.
    • Si el valor restante, digamos (target – arr2[i]) es menor que 0 , entonces no se puede formar el par, así que continúe con la iteración .
    • Use la función FloorKey() de TreeMap para encontrar un valor menor o igual que el valor restante. Si el valor devuelto de la función anterior es nulo , entonces no se encuentra ningún elemento correspondiente.
    • Si el valor devuelto, digamos que el objetivo actual es mayor que el objetivo más cercano , actualice el objetivo más cercano y reinicie el resultado de arrayList [] en una nueva lista.
    • Repita la lista de ID cuya clave es currentTarget y agregue todas las combinaciones posibles de pares de ID en la lista de resultados .
  • Después de completar los pasos anteriores, imprima todos los pares de ID almacenados en ArrayList result[] .

A continuación se muestra la implementación del enfoque anterior:

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);
    }
}
Producción:

1 1
3 1
1 2
3 2

Complejidad de tiempo: O(N*log N + M)
Espacio auxiliar: O(N*M)

Publicación traducida automáticamente

Artículo escrito por darkphoenix349 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *