Cuente todos los pares distintos con diferencia igual a K | conjunto 2

Dada una array de enteros arr[] y un entero positivo K , la tarea es contar todos los pares distintos con diferencias iguales a K.

Ejemplos:

Entrada: arr[ ] = {1, 5, 3, 4, 2}, K = 3
Salida: 2
Explicación: Hay 2 pares distintos con diferencia 3, los pares son {1, 4} y {5, 2} 

Entrada: arr[] = {8, 12, 16, 4, 0, 20}, K = 4
Salida: 5
Explicación: Hay 5 pares únicos con diferencia 4. 
Los pares son {0, 4}, {4, 8 }, {8, 12}, {12, 16} y {16, 20}

 

El enfoque ingenuo y el enfoque basado en la clasificación y la búsqueda binaria se mencionan en el Conjunto 1 de este artículo.

Enfoque: la complejidad temporal de este problema se puede reducir para que tenga una complejidad lineal en el caso promedio mediante el uso de hashing con la ayuda de mapas desordenados según la siguiente idea:

Para formar tales pares únicos, si se atraviesa desde el elemento más pequeño, un elemento (por ejemplo, x ) formará tal par con otro elemento que tenga valor (x+K) .
Cuando la diferencia K = 0, los elementos que tengan una frecuencia superior a 1 podrán formar pares consigo mismos.

Siga los pasos que se mencionan a continuación para resolver el problema:

  • Inicialice un mapa desordenado e inserte todos los elementos de la array en el mapa.
  • Si el valor dado de K es 0 :
    • Si la frecuencia del elemento actual x es mayor que 1, incremente la cuenta en 1.
    • De lo contrario, intente lo mismo con los demás elementos.
  • Si el valor dado de K no es 0:
    • Busque x + K en el mapa y si lo encuentra, incremente el conteo en 1.
    • De lo contrario, intente con los otros elementos.
  • Devuelve la cuenta .

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

C++

// C++ code to implement the above approach.
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find total pairs
int TotalPairs(vector<int> nums, int K)
{
    // Initializing a map
    unordered_map<int, int> mp;
    int cnt = 0;
 
    for (int i = 0; i < nums.size(); i++) {
        mp[nums[i]]++;
    }
 
    // Difference equal to zero
    if (K == 0) {
        for (auto i : mp) {
 
            // Frequency of element is
            // greater than one then
            // distinct pair is possible
            if (i.second > 1)
                cnt++;
        }
    }
 
    // Difference is not equal to zero
    else {
        for (auto i : mp) {
 
            // Frequency of element + k
            // is not zero then distinct
            // pair is possible
            if (mp.find(i.first + K)
                != mp.end()) {
                cnt++;
            }
        }
    }
    return cnt;
}
 
// Driver Code
int main()
{
    vector<int> arr = { 8, 12, 16, 4, 0, 20 };
    int K = 4;
 
    // Function call
    int ans = TotalPairs(arr, K);
    cout << ans;
    return 0;
}

Java

// Java code to implement the above approach.
import java.io.*;
import java.util.*;
 
class GFG {
    // Function to find total pairs
    public static int TotalPairs(int nums[], int K)
    {
        // Initializing a map
        Map<Integer, Integer> mp
            = new HashMap<Integer, Integer>();
        int cnt = 0;
 
        for (int i = 0; i < nums.length; i++) {
            if (mp.get(nums[i]) != null)
                mp.put(nums[i], mp.get(nums[i]) + 1);
            else
                mp.put(nums[i], 1);
        }
 
        // Difference equal to zero
        if (K == 0) {
            for (Map.Entry<Integer, Integer> it :
                 mp.entrySet()) {
 
                // Frequency of element is
                // greater than one then
                // distinct pair is possible
                if (it.getValue() > 1)
                    cnt++;
            }
        }
 
        // Difference is not equal to zero
        else {
            for (Map.Entry<Integer, Integer> it :
                 mp.entrySet()) {
 
                // Frequency of element + k
                // is not zero then distinct
                // pair is possible
                if (mp.get(it.getKey() + K) != null) {
                    cnt++;
                }
            }
        }
        return cnt;
    }
    public static void main(String[] args)
    {
        int arr[] = { 8, 12, 16, 4, 0, 20 };
        int K = 4;
 
        // Function call
        int ans = TotalPairs(arr, K);
        System.out.print(ans);
    }
}
 
// This code is contributed by Rohit Pradhan

Python3

# Python3 program for above approach
 
# function to find total pairs
def TotalPairs(nums, K):
   
    # Initializing a map or dictionary
    mp = dict()
    cnt = 0
    for i in range(len(nums)):
        if nums[i] in mp:
            mp[nums[i]] += 1
        else:
            mp[nums[i]] = 1
 
    # Difference equal to zero
    if K == 0:
        for i in mp:
            # Frequency of element is
            # greater than one then
            # distinct pair is possible
            if mp[i] > 1:
                cnt += 1
    # Difference is not equal to zero
    else:
        for i in mp:
            # Frequency of element + k
            # is not zero then distinct
            #pair is possible
            if i + K in mp:
                cnt += 1
 
    return cnt
 
# Driver Code
arr = [8, 12, 16, 4, 0, 20]
K = 4
 
# Function call
ans = TotalPairs(arr, K)
print(ans)
 
# This code is contributed by phasing17

C#

// C# code to implement the above approach.
 
using System;
using System.Collections.Generic;
 
public class GFG {
  public static int TotalPairs(int[] nums, int K)
  {
    // Initializing a map
    Dictionary<int, int> mp
      = new Dictionary<int, int>();
 
    int cnt = 0;
 
    for (int i = 0; i < nums.Length; i++) {
      if (mp.ContainsKey(nums[i]))
        mp[nums[i]] += 1;
      else
        mp[nums[i]] = 1;
    }
 
    // Difference equal to zero
    if (K == 0) {
      foreach(KeyValuePair<int, int> it in mp)
      {
 
        // Frequency of element is
        // greater than one then
        // distinct pair is possible
        if (it.Value > 1)
          cnt++;
      }
    }
 
    // Difference is not equal to zero
    else {
      foreach(KeyValuePair<int, int> it in mp)
      {
 
        // Frequency of element + k
        // is not zero then distinct
        // pair is possible
        if (mp.ContainsKey(it.Key + K)) {
          cnt++;
        }
      }
    }
    return cnt;
  }
 
  public static void Main(string[] args)
  {
    int[] arr = { 8, 12, 16, 4, 0, 20 };
    int K = 4;
 
    // Function call
    int ans = TotalPairs(arr, K);
    Console.Write(ans);
  }
}
 
// This code is contributed by phasing17

Javascript

<script>// JavaScript program for the above approach
 
// function to find total pairs
function TotalPairs(nums, K)
{
    // Initializing a map or dictionary
    var mp = {};
    var cnt = 0;
    for (var i = 0; i < nums.length; i++) {
        if (mp.hasOwnProperty(nums[i]))
            mp[nums[i]] += 1;
        else
            mp[nums[i]] = 1;
    }
 
    // Difference equal to zero
    if (K == 0) {
        for (const i of Object.keys(mp)) {
            // Frequency of element is
            // greater than one then
            // distinct pair is possible
            console.log(i, mp[i], cnt);
            if (mp[i] > 1)
                cnt += 1;
        }
    }
 
    // Difference is not equal to zero
    else {
        for (const i of Object.keys(mp)) {
            // Frequency of element + k
            // is not zero then distinct
            // pair is possible\
            if (mp.hasOwnProperty(parseInt(i) + K))
            {
                cnt += 1;
            }
        }
    }
    return cnt;
}
// Driver Code
var arr = [ 8, 12, 16, 4, 0, 20 ];
var K = 4;
 
// Function call
// var ans = TotalPairs(arr, K);
document.write(TotalPairs(arr, K));
 
// This code is contributed by phasing17
</script>
Producción

5

Complejidad de tiempo: O(N) [En el caso promedio, porque la complejidad de tiempo del caso promedio del mapa desordenado es O(1)]
Espacio auxiliar: O(N)

Publicación traducida automáticamente

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