Cuente pares en una array cuya diferencia absoluta sea divisible por K | Usando el mapa

Dada una array , arr[] de N elementos y un entero K , la tarea es encontrar el número de pares (i, j) tales que el valor absoluto de (arr[i] – arr[j]) sea un múltiplo de k _

Ejemplos: 

Entrada: N = 4, K = 2, arr[] = {1, 2, 3, 4}
Salida: 2
Explicación: Hay un total de 2 pares en la array con una diferencia absoluta divisible por 2. Los pares son: (1, 3 ), (2, 4).

Entrada: N = 3, K = 3, arr[] = {3, 3, 3}
Salida: 3
Explicación: Hay  un total de 3 pares en esta array con una diferencia absoluta divisible por 3. Los pares son: (3, 3), (3, 3), (3, 3). 

 

Enfoque ingenuo: la forma más fácil es iterar a través de cada par posible en la array y si la diferencia absoluta de los números es un múltiplo de K , entonces aumente el conteo en 1 . Imprime el valor del conteo después de procesar todos los pares.
Complejidad de Tiempo: O(N 2 )
Espacio Auxiliar: O(1)

Enfoque de array de frecuencias: el enfoque para resolver este problema utilizando una array de frecuencias se analiza en el Conjunto 1 de este artículo . En este enfoque, hemos discutido el enfoque para resolverlo usando el mapa.

Enfoque eficiente:  Para optimizar el enfoque anterior, la idea es observar el hecho de que para dos números a[i] y a[j] , si a[i] % k = a[j] % k , entonces abs(a[ i] – a[j]) es un múltiplo de K . Siga los pasos a continuación para resolver el problema:

  • Inicialice la variable ans como 0 para almacenar la respuesta.
  • Declare un mapa_desordenado<int, int> count_map[] que almacena el recuento de restos de elementos de array con K .
  • Itere sobre el rango [1, N] usando el índice variable e incremente el valor arr[index]%k en el mapa de conteo en 1 para cada índice.
  • Iterar sobre todos los pares clave-valor en count_map . Para cada par clave-valor:
    • El valor count_map[rem] es el número de elementos cuyo resto con K es igual a ‘ rem ‘.
    • Para que se forme un par válido, seleccione dos números cualesquiera de los números count_map[rem] .
    • El número de formas de seleccionar dos números de ‘ N ‘ números es Nc2 = N * (N – 1) / 2 .
  • Agregue la respuesta de todos los pares clave-valor e imprima ans .

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

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to count number of pairs
// (i, j) such that abs(arr[i] - arr[j])
// is divisible by k.
void countOfPairs(int* arr, int N, int K)
{
 
    // Frequency Map to keep count of
    // remainders of array elements with K.
    unordered_map<int, int> count_map;
 
    for (int index = 0; index < N; ++index) {
        count_map[arr[index] % K]++;
    }
 
    // To store the final answer.
    int ans = 0;
    for (auto it : count_map) {
 
        // Number of ways of selecting any two
        // numbers from all numbers having the
        // same remainder is Nc2 = N
        // * (N - 1) / 2
        ans += (it.second * (it.second - 1)) / 2;
    }
 
    // Output the answer.
    cout << ans << endl;
}
 
// Driver Code
int main()
{
    int K = 2;
 
    // Input array
    int arr[] = { 1, 2, 3, 4 };
 
    // Size of array
    int N = sizeof arr / sizeof arr[0];
 
    countOfPairs(arr, N, K);
 
    return 0;
}

Java

// Java program for the above approach
import java.util.*;
 
class GFG {
 
    // Function to count number of pairs
    // (i, j) such that Math.abs(arr[i] - arr[j])
    // is divisible by k.
    static void countOfPairs(int[] arr, int N, int K) {
 
        // Frequency Map to keep count of
        // remainders of array elements with K.
        HashMap<Integer, Integer> count_map =
                new HashMap<Integer, Integer>();
 
        for (int index = 0; index < N; ++index) {
            if (count_map.containsKey(arr[index] % K)) {
                count_map.put(arr[index] % K,
                        count_map.get(arr[index] % K) + 1);
            } else {
                count_map.put(arr[index] % K, 1);
            }
        }
 
        // To store the final answer.
        int ans = 0;
        for (Map.Entry<Integer, Integer> it : count_map.entrySet()) {
 
            // Number of ways of selecting any two
            // numbers from all numbers having the
            // same remainder is Nc2 = N
            // * (N - 1) / 2
            ans += (it.getValue() * (it.getValue() - 1)) / 2;
        }
 
        // Output the answer.
        System.out.print(ans + "\n");
    }
 
    // Driver Code
    public static void main(String[] args) {
        int K = 2;
 
        // Input array
        int arr[] = { 1, 2, 3, 4 };
 
        // Size of array
        int N = arr.length;
 
        countOfPairs(arr, N, K);
 
    }
}
 
// This code is contributed by shikhasingrajput

Python3

# Python Program to implement
# the above approach
 
# Function to count number of pairs
# (i, j) such that abs(arr[i] - arr[j])
# is divisible by k.
def countOfPairs(arr, N, K):
 
    # Frequency Map to keep count of
    # remainders of array elements with K.
    count_map = {}
 
    for index in range(N):
 
        if (not arr[index] % K in count_map):
            count_map[arr[index] % K] = 1
        else:
            count_map[arr[index] % K] += 1
 
    # To store the final answer.
    ans = 0
    for val in count_map.values():
 
        # Number of ways of selecting any two
        # numbers from all numbers having the
        # same remainder is Nc2 = N
        # * (N - 1) / 2
        ans += (val * (val - 1)) // 2
 
    # Output the answer.
    print(ans)
 
# Driver Code
K = 2
 
# Input array
arr = [1, 2, 3, 4]
 
# Size of array
N = len(arr)
 
countOfPairs(arr, N, K)
 
# This code is contributed by Saurabh Jaiswal

C#

// C# program for the above approach
using System;
using System.Collections.Generic;
 
public class GFG {
 
    // Function to count number of pairs
    // (i, j) such that Math.Abs(arr[i] - arr[j])
    // is divisible by k.
    static void countOfPairs(int[] arr, int N, int K) {
 
        // Frequency Map to keep count of
        // remainders of array elements with K.
        Dictionary<int, int> count_map =
                new Dictionary<int, int>();
 
        for (int index = 0; index < N; ++index) {
            if (count_map.ContainsKey(arr[index] % K)) {
                count_map[arr[index] % K] =
                        count_map[arr[index] % K] + 1;
            } else {
                count_map.Add(arr[index] % K, 1);
            }
        }
 
        // To store the readonly answer.
        int ans = 0;
        foreach (KeyValuePair<int, int> it in count_map) {
 
            // Number of ways of selecting any two
            // numbers from all numbers having the
            // same remainder is Nc2 = N
            // * (N - 1) / 2
            ans += (it.Value * (it.Value - 1)) / 2;
        }
 
        // Output the answer.
        Console.Write(ans + "\n");
    }
 
    // Driver Code
    public static void Main(String[] args) {
        int K = 2;
 
        // Input array
        int []arr = { 1, 2, 3, 4 };
 
        // Size of array
        int N = arr.Length;
 
        countOfPairs(arr, N, K);
 
    }
}
 
// This code is contributed by shikhasingrajput

Javascript

<script>
      // JavaScript Program to implement
      // the above approach
 
      // Function to count number of pairs
      // (i, j) such that abs(arr[i] - arr[j])
      // is divisible by k.
      function countOfPairs(arr, N, K) {
 
          // Frequency Map to keep count of
          // remainders of array elements with K.
          let count_map = new Map();
 
          for (let index = 0; index < N; ++index) {
 
              if (!count_map.has(arr[index] % K))
                  count_map.set(arr[index] % K, 1);
              else
                  count_map.set(arr[index] % K, count_map.get(arr[index] % K) + 1)
          }
 
          // To store the final answer.
          let ans = 0;
          for (let [key, value] of count_map) {
 
              // Number of ways of selecting any two
              // numbers from all numbers having the
              // same remainder is Nc2 = N
              // * (N - 1) / 2
              ans += (value * (value - 1)) / 2;
          }
 
          // Output the answer.
          document.write(ans + '<br>');
      }
 
      // Driver Code
      let K = 2;
 
      // Input array
      let arr = [1, 2, 3, 4];
 
      // Size of array
      let N = arr.length;
 
      countOfPairs(arr, N, K);
 
  // This code is contributed by Potta Lokesh
  </script>
Producción

2

Complejidad temporal: O(NlogN)
Espacio auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por shreyasshetty788 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 *