Cuente el número de pares (i, j) de una array tal que arr[i] * j = arr[j] * i

Dada una array arr[] de tamaño N , la tarea es contar el número de pares (i, j) posibles de la array tal que arr[j] * i = arr[i] * j , donde 1 ≤ i < j ≤ n

Ejemplos:

Entrada: arr[] = {1, 3, 5, 6, 5}
Salida: 2
Explicación: 
Par (1, 5) cumple la condición, ya que arr[1] * 5 = arr[5] * 1.
Par (2 , 4) satisface la condición, ya que arr[2] * 4 = arr[4] * 2. 
Por lo tanto, el número total de pares que satisfacen la condición dada es 2.

Entrada: arr[] = {2, 1, 3}
Salida: 0

 

Enfoque ingenuo: el enfoque más simple para resolver el problema es generar todos los pares posibles de la array y verificar para cada par, si la condición dada satisface o no. Aumente el recuento de los pares para los que se cumple la condición. Finalmente, imprima el conteo de todos esos pares. 

Complejidad de Tiempo: O(N 2 )
Espacio Auxiliar: O(1)

Enfoque eficiente: para optimizar el enfoque anterior, la idea se basa en la reorganización de la ecuación dada arr[i] * j = arr[j] * i a arr[i] / i = arr[j] / j
Siga los pasos a continuación para resolver el problema: 

  • Inicialice una variable, digamos count , para almacenar el recuento total de pares que satisfacen las condiciones dadas.
  • Inicialice un mapa desordenado , digamos mp, para contar la frecuencia de los valores arr[i] / i .
  • Recorra la array arr[] y actualice las frecuencias de arr[i]/i en el Mapa .
  • Imprime el conteo como la respuesta.

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 pairs from an
// array satisfying given conditions
void countPairs(int arr[], int N)
{
    // Stores the total
    // count of pairs
    int count = 0;
 
    // Stores count of a[i] / i
    unordered_map<double, int> mp;
 
    // Traverse the array
    for (int i = 0; i < N; i++) {
        double val = 1.0 * arr[i];
        double idx = 1.0 * (i + 1);
 
        // Updating count
        count += mp[val / idx];
 
        // Update frequency
        // in the Map
        mp[val / idx]++;
    }
 
    // Print count of pairs
    cout << count;
}
 
// Driver Code
int main()
{
    // Given array
    int arr[] = { 1, 3, 5, 6, 5 };
 
    // Size of the array
    int N = sizeof(arr) / sizeof(arr[0]);
 
    // Function call to count pairs
    // satisfying given conditions
    countPairs(arr, N);
 
    return 0;
}

Java

// Java program for the above approach
import java.util.*;
 
class GFG{
   
// Function to count pairs from an
// array satisfying given conditions
static void countPairs(int []arr, int N)
{
     
    // Stores the total
    // count of pairs
    int count = 0;
 
    // Stores count of a[i]/i
    Map<Double, Integer>  mp
            = new HashMap<Double, Integer>();
 
    // Traverse the array
    for(int i = 0; i < N; i++)
    {
        Double val = 1.0 * arr[i];
        Double idx = 1.0 * (i + 1);
 
        // Updating count
        if (mp.containsKey(val / idx))
            count += mp.get(val/idx);
 
        // Update frequency
        // in the Map
        if (mp.containsKey(val / idx))
            mp.put(val / idx, mp.getOrDefault(val / idx, 0) + 1);
        else
            mp.put(val/idx, 1);
    }
 
    // Print count of pairs
    System.out.print(count);
}
 
// Driver Code
public static void main(String args[])
{
     
    // Given array
    int []arr = { 1, 3, 5, 6, 5 };
 
    // Size of the array
    int N = arr.length;
 
    // Function call to count pairs
    // satisfying given conditions
    countPairs(arr, N);
}
}
 
// This code is contributed by ipg2016107.

Python3

# Python3 program for the above approach
from collections import defaultdict
 
# Function to count pairs from an
# array satisfying given conditions
def countPairs(arr, N):
 
    # Stores the total
    # count of pairs
    count = 0
 
    # Stores count of a[i] / i
    mp = defaultdict(int)
 
    # Traverse the array
    for i in range(N):
        val = 1.0 * arr[i]
        idx = 1.0 * (i + 1)
 
        # Updating count
        count += mp[val / idx]
 
        # Update frequency
        # in the Map
        mp[val / idx] += 1
 
    # Print count of pairs
    print(count)
 
# Driver Code
if __name__ == "__main__":
 
    # Given array
    arr = [1, 3, 5, 6, 5]
 
    # Size of the array
    N = len(arr)
 
    # Function call to count pairs
    # satisfying given conditions
    countPairs(arr, N)
 
# This code is contributed by ukasp

C#

// C# program for the above approach
using System;
using System.Collections.Generic;
 
class GFG{
   
// Function to count pairs from an
// array satisfying given conditions
static void countPairs(int []arr, int N)
{
     
    // Stores the total
    // count of pairs
    int count = 0;
 
    // Stores count of a[i]/i
    Dictionary<double,
               int> mp = new Dictionary<double,
                                        int>();
 
    // Traverse the array
    for(int i = 0; i < N; i++)
    {
        double val = 1.0 * arr[i];
        double idx = 1.0 * (i + 1);
 
        // Updating count
        if (mp.ContainsKey(val / idx))
            count += mp[val/idx];
 
        // Update frequency
        // in the Map
        if (mp.ContainsKey(val / idx))
            mp[val / idx]++;
        else
            mp[val/idx] = 1;
    }
 
    // Print count of pairs
    Console.WriteLine(count);
}
 
// Driver Code
public static void Main()
{
     
    // Given array
    int []arr = { 1, 3, 5, 6, 5 };
 
    // Size of the array
    int N = arr.Length;
 
    // Function call to count pairs
    // satisfying given conditions
    countPairs(arr, N);
}
}
 
// This code is contributed by SURENDRA_GANGWAR

Javascript

<script>
 
// Javascript program for the above approach
 
// Function to count pairs from an
// array satisfying given conditions
function countPairs(arr, N)
{
    // Stores the total
    // count of pairs
    var count = 0;
 
    // Stores count of a[i] / i
    var mp = new Map();
 
    // Traverse the array
    for (var i = 0; i < N; i++) {
        var val = 1.0 * arr[i];
        var idx = 1.0 * (i + 1);
 
        // Updating count
        count += mp.has(val/idx)?mp.get(val/idx):0
 
        // Update frequency
        // in the Map
        if(mp.has(val/idx))
            mp.set(val/idx, mp.get(val/idx)+1)
        else
            mp.set(val/idx, 1)
 
    }
 
    // Print count of pairs
    document.write( count);
}
 
// Driver Code
// Given array
var arr = [1, 3, 5, 6, 5];
 
// Size of the array
var N = arr.length;
 
// Function call to count pairs
// satisfying given conditions
countPairs(arr, N);
 
// This code is contributed by itsok.
 
</script>
Producción: 

2

 

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

Publicación traducida automáticamente

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