Número de subarreglos que consisten solo en números pronicos

Dada una array arr[] que consiste en N enteros positivos, la tarea es contar el número de subarreglos que consisten solo en números pronicos .

Ejemplos:

Entrada: arr[] = {5, 6, 12, 3, 4}
Salida: 3
Explicación: El subarreglo que consta solo de números pronicos es: 

  1. {6}
  2. {12}
  3. {6, 12}

Por lo tanto, el recuento total de dichos subarreglos es 3.

Entrada: arr[] = {0, 4, 20, 30, 5}
Salida:

Enfoque ingenuo: el enfoque más simple para resolver el problema es generar todos los subarreglos posibles del arreglo dado y contar esos subarreglos formados solo por números pronicos . Después de verificar todos los subarreglos, imprima el conteo obtenido. 

Complejidad Temporal: O(√M * N 3 ), donde M es el máximo elemento presente en el arreglo  
Espacio Auxiliar: O(N)

Enfoque eficiente: el enfoque anterior se puede optimizar manteniendo el seguimiento de secuencias continuas de números pronicos y luego, contando el número de subarreglos formados. 
Siga los pasos a continuación para resolver el problema:

  • Inicialice una variable, digamos count , para almacenar el recuento total de subarreglos , y una variable C , para almacenar el recuento de elementos de array continua que son números pronicos .
  • Recorra la array dada arr[] y realice los siguientes pasos:
    • Si el elemento actual arr[i] es un número pronico , entonces incremente C en 1 .
    • De lo contrario, incremente el conteo en C * (C – 1)/2 para contar el número de subarreglos con elementos C que tienen números pronicos y actualice C a 0 .
  • Incremente el valor de cuenta como C*(C – 1)/2 .
  • Después de completar los pasos anteriores, imprima el valor de conteo como resultado.

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

C++

// C++ program for the approach
#include <iostream>
#include <cmath>
using namespace std;
 
// Function to check if a number
// is pronic number or not
bool isPronic(int n)
{
     
    // Iterate over the range [1, sqrt(N)]
    int range = sqrt(n);
     
    for(int i = 0; i < range + 1; i++)
    {
         
        // Return true if N is pronic
        if (i * (i + 1) == n)
            return true;    
    }
     
    // Otherwise, return false
    return false;
}
 
// Function to count the number of
// subarrays consisting of pronic numbers
int countSub(int *arr, int n)
{
     
    // Stores the count of subarrays
    int ans = 0;
     
    // Stores the number of consecutive
    // array elements which are pronic
    int ispro = 0;
     
    // Traverse the array
    for(int i = 0; i < n; i++)
    {
         
        // If i is pronic
        if (isPronic(arr[i]))
            ispro += 1;
        else
            ispro = 0;
             
        ans += ispro;
    }
     
    // Return the total count
    return ans;
}
 
// Driver code
int main()
{
    int arr[5] = {5, 6, 12, 3, 4};
    int n = sizeof(arr) / sizeof(arr[0]);
     
    cout << countSub(arr, n);
     
    return 0;
}
 
// This code is contributed by rohitsingh07052

Java

// Java program for the approach
import java.lang.*;
class GFG
{
 
  // Function to check if a number
  // is pronic number or not
  static boolean isPronic(int n)
  {
 
    // Iterate over the range [1, sqrt(N)]
    int range = (int)Math.sqrt(n);
 
    for(int i = 0; i < range + 1; i++)
    {
 
      // Return true if N is pronic
      if (i * (i + 1) == n)
        return true;    
    }
 
    // Otherwise, return false
    return false;
  }
 
  // Function to count the number of
  // subarrays consisting of pronic numbers
  static int countSub(int[] arr, int n)
  {
 
    // Stores the count of subarrays
    int ans = 0;
 
    // Stores the number of consecutive
    // array elements which are pronic
    int ispro = 0;
 
    // Traverse the array
    for(int i = 0; i < n; i++)
    {
 
      // If i is pronic
      if (isPronic(arr[i]))
        ispro += 1;
      else
        ispro = 0;
 
      ans += ispro;
    }
 
    // Return the total count
    return ans;
  }
 
  // Driver code
  public static void main(String[] args)
  {
    int[] arr = {5, 6, 12, 3, 4};
    int n = arr.length;
    System.out.print(countSub(arr, n));
  }
}
 
// This code is contributed by shivani

Python3

# Python3 program for the approach
 
# Function to check if a number
# is pronic number or not
def isPronic(n):
   
    # Iterate over the range [1, sqrt(N)]
    for i in range(int(n ** (1 / 2)) + 1):
       
        # Return true if N is pronic
        if i * (i + 1) == n:
            return True
           
    # Otherwise, return false
    return False
 
# Function to count the number of
# subarrays consisting of pronic numbers
def countSub(arr):
 
    # Stores the count of subarrays
    ans = 0
 
    # Stores the number of consecutive
    # array elements which are pronic
    ispro = 0
 
    # Traverse the array
    for i in arr:
 
        # If i is pronic
        if isPronic(i):
            ispro += 1
        else:
            ispro = 0
 
        ans += ispro
         
    # Return the total count
    return ans
 
 
# Driver Code
 
arr = [5, 6, 12, 3, 4]
print(countSub(arr))

C#

// C# program for the approach
using System;
class GFG
{
 
  // Function to check if a number
  // is pronic number or not
  static bool isPronic(int n)
  {
 
    // Iterate over the range [1, sqrt(N)]
    int range = (int)Math.Sqrt(n);        
    for(int i = 0; i < range + 1; i++)
    {
 
      // Return true if N is pronic
      if (i * (i + 1) == n)
        return true;    
    }
 
    // Otherwise, return false
    return false;
  }
 
  // Function to count the number of
  // subarrays consisting of pronic numbers
  static int countSub(int[] arr, int n)
  {
 
    // Stores the count of subarrays
    int ans = 0;
 
    // Stores the number of consecutive
    // array elements which are pronic
    int ispro = 0;
 
    // Traverse the array
    for(int i = 0; i < n; i++)
    {
 
      // If i is pronic
      if (isPronic(arr[i]))
        ispro += 1;
      else
        ispro = 0;
      ans += ispro;
    }
 
    // Return the total count
    return ans;
  }
 
  // Driver code
  static void Main() {
    int[] arr = {5, 6, 12, 3, 4};
    int n = arr.Length;
 
    Console.WriteLine(countSub(arr, n));
  }
}
 
// This code is contributed by divyesh072019.

Javascript

<script>
// Javascript program for the approach
 
// Function to check if a number
// is pronic number or not
function isPronic(n)
{
     
    // Iterate over the range [1, sqrt(N)]
    let range = Math.sqrt(n);
     
    for(let i = 0; i < range + 1; i++)
    {
         
        // Return true if N is pronic
        if (i * (i + 1) == n)
            return true;    
    }
     
    // Otherwise, return false
    return false;
}
 
// Function to count the number of
// subarrays consisting of pronic numbers
function countSub(arr, n)
{
     
    // Stores the count of subarrays
    let ans = 0;
     
    // Stores the number of consecutive
    // array elements which are pronic
    let ispro = 0;
     
    // Traverse the array
    for(let i = 0; i < n; i++)
    {
         
        // If i is pronic
        if (isPronic(arr[i]))
            ispro += 1;
        else
            ispro = 0;
             
        ans += ispro;
    }
     
    // Return the total count
    return ans;
}
 
// Driver code
let arr = [5, 6, 12, 3, 4];
let n = arr.length;
 
document.write(countSub(arr, n));
 
// This code is contributed by souravmahato348.
</script>
Producción

3

Complejidad de tiempo: O(N*sqrt(M)), donde M es el elemento máximo presente en la array .
Espacio Auxiliar: O(1)

Publicación traducida automáticamente

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