Recuento de tripletes en una array tal que A[i] * A[j] = A[k] e i < j < k

Dado un arreglo A[ ] que consta de N enteros positivos, la tarea es encontrar el número de tripletes A[i], A[j] y A[k] en el arreglo tal que i < j < k y A[i] * A[j] = A[k] .

Ejemplos:

Entrada: N = 5, A[ ] = {2, 3, 4, 6, 12} 
Salida:
Explicación: 
Los tripletes válidos de la array dada son: 
(A[0], A[1], A[3] ) = (2, 3, 6) donde (2*3 = 6) 
(A[0], A[3], A[4]) = (2, 6, 12) donde (2*6 = 12) 
( A[1], A[2], A[4]) = (3, 4, 12) donde (3*4 = 12) 
Por lo tanto, existe un total de 3 tripletes que satisfacen la condición dada.
Entrada: N = 3, A[ ] = {1, 1, 1} 
Salida:
Explicación: 
El único triplete válido es (A[0], A[1], A[2]) = (1, 1, 1 ) 
 

Enfoque ingenuo: 
el enfoque más simple para resolver el problema es generar todos los tripletes posibles y, para cada triplete, verificar si satisface la condición requerida. Si se determina que es cierto, aumente el conteo de trillizos. Después de completar el recorrido de la array y generar todos los tripletes posibles, imprima el recuento final . 
Complejidad de tiempo: O(N 3
Espacio auxiliar: O(1)
Enfoque eficiente: 
El enfoque anterior puede optimizarse utilizando Two Pointers y HashMap
Siga los pasos a continuación para resolver el problema: 
 

  • Inicialice un mapa para almacenar frecuencias de elementos de array.
  • Iterar sobre la array a la inversa, es decir, hacer un bucle con una variable j en el rango [N – 2, 1] .
  • Por cada j , aumente la cuenta de A[j + 1] en el mapa. Itere sobre el rango [0, j – 1] usando la variable i y verifique si A[i] * A[j] está presente en el mapa o no.
  • Si se encuentra A[i] * A[j] en el mapa, aumente el conteo de trillizos por la frecuencia de A[i] * A[j] almacenada en el mapa.
  • Después de completar el recorrido de la array, imprima el conteo final .

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

C++

// C++ Program to implement
// the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Returns total number of
// valid triplets possible
int countTriplets(int A[], int N)
{
    // Stores the count
    int ans = 0;
 
    // Map to store frequency
    // of array elements
    map<int, int> map;
 
    for (int j = N - 2; j >= 1; j--) {
 
        // Increment the frequency
        // of A[j+1] as it can be
        // a valid A[k]
        map[A[j + 1]]++;
 
        for (int i = 0; i < j; i++) {
 
            int target = A[i] * A[j];
 
            // If target exists in the map
            if (map.find(target)
                != map.end())
                ans += map[target];
        }
    }
 
    // Return the final count
    return ans;
}
 
// Driver Code
int main()
{
    int N = 5;
    int A[] = { 2, 3, 4, 6, 12 };
 
    cout << countTriplets(A, N);
 
    return 0;
}

Java

// Java program to implement
// the above approach
import java.util.*;
 
class GFG{
 
// Returns total number of
// valid triplets possible
static int countTriplets(int A[], int N)
{
     
    // Stores the count
    int ans = 0;
 
    // Map to store frequency
    // of array elements
    HashMap<Integer,
            Integer> map = new HashMap<Integer,
                                       Integer>();
                                        
    for(int j = N - 2; j >= 1; j--)
    {
 
        // Increment the frequency
        // of A[j+1] as it can be
        // a valid A[k]
        if(map.containsKey(A[j + 1]))
            map.put(A[j + 1], map.get(A[j + 1]) + 1);
        else
            map.put(A[j + 1], 1);
 
        for(int i = 0; i < j; i++)
        {
            int target = A[i] * A[j];
 
            // If target exists in the map
            if (map.containsKey(target))
                ans += map.get(target);
        }
    }
 
    // Return the final count
    return ans;
}
 
// Driver Code
public static void main(String[] args)
{
    int N = 5;
    int A[] = { 2, 3, 4, 6, 12 };
 
    System.out.print(countTriplets(A, N));
}
}
 
// This code is contributed by sapnasingh4991

Python3

# Python3 program for the above approach
from collections import defaultdict
 
# Returns total number of
# valid triplets possible
def countTriplets(A, N):
 
    # Stores the count
    ans = 0
 
    # Map to store frequency
    # of array elements
    map = defaultdict(lambda: 0)
 
    for j in range(N - 2, 0, -1):
 
        # Increment the frequency
        # of A[j+1] as it can be
        # a valid A[k]
        map[A[j + 1]] += 1
 
        for i in range(j):
            target = A[i] * A[j]
 
            # If target exists in the map
            if(target in map.keys()):
                ans += map[target]
 
    # Return the final count
    return ans
 
# Driver code
if __name__ == '__main__':
 
    N = 5
    A = [ 2, 3, 4, 6, 12 ]
 
    print(countTriplets(A, N))
 
# This code is contributed by Shivam Singh

C#

// C# program to implement
// the above approach
using System;
using System.Collections.Generic;
class GFG{
 
// Returns total number of
// valid triplets possible
static int countTriplets(int []A, int N)
{
     
    // Stores the count
    int ans = 0;
 
    // Map to store frequency
    // of array elements
    Dictionary<int,
               int> map = new Dictionary<int,
                                         int>();
                                        
    for(int j = N - 2; j >= 1; j--)
    {
 
        // Increment the frequency
        // of A[j+1] as it can be
        // a valid A[k]
        if(map.ContainsKey(A[j + 1]))
            map[A[j + 1]] = map[A[j + 1]] + 1;
        else
            map.Add(A[j + 1], 1);
 
        for(int i = 0; i < j; i++)
        {
            int target = A[i] * A[j];
 
            // If target exists in the map
            if (map.ContainsKey(target))
                ans += map[target];
        }
    }
 
    // Return the readonly count
    return ans;
}
 
// Driver Code
public static void Main(String[] args)
{
    int N = 5;
    int []A = { 2, 3, 4, 6, 12 };
 
    Console.Write(countTriplets(A, N));
}
}
 
// This code is contributed by sapnasingh4991

Javascript

<script>
 
// Javascript program to implement
// the above approach
  
// Returns total number of
// valid triplets possible
function countTriplets(A, N)
{
      
    // Stores the count
    let ans = 0;
  
    // Map to store frequency
    // of array elements
    let map = new Map();
                                         
    for(let j = N - 2; j >= 1; j--)
    {
  
        // Increment the frequency
        // of A[j+1] as it can be
        // a valid A[k]
        if(map.has(A[j + 1]))
            map.set(A[j + 1], map.get(A[j + 1]) + 1);
        else
            map.set(A[j + 1], 1);
  
        for(let i = 0; i < j; i++)
        {
            let target = A[i] * A[j];
  
            // If target exists in the map
            if (map.has(target))
                ans += map.get(target);
        }
    }
  
    // Return the final count
    return ans;
}
  
// Driver code
    let N = 5;
    let A = [ 2, 3, 4, 6, 12 ];
  
    document.write(countTriplets(A, N));
 
// This code is contributed by souravghosh0416.
</script>
Producción:

3

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

Publicación traducida automáticamente

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