📜  仅由Pronic Numbers组成的子数组数

📅  最后修改于: 2021-04-17 19:02:53             🧑  作者: Mango

给定一个由N个正整数组成的数组arr [] ,任务是计算仅由质子数组成的子数组的数量。

例子:

天真的方法:解决问题的最简单方法是生成给定数组的所有可能的子数组,并对仅由质子数组成的那些子数组进行计数。检查所有子阵列后,打印获得的计数。

时间复杂度: O(√M* N 3 ),其中M数组中存在最大元素
辅助空间: O(N)

高效方法:可以通过跟踪质子数的连续序列,然后计算形成的子阵列的数量来优化上述方法。
请按照以下步骤解决问题:

  • 初始化一个变量,例如count ,以存储子数组的总数,并初始化一个变量C ,以存储连续数组元素的数量,这些连续数组元素是质子数。
  • 遍历给定数组arr []并执行以下步骤:
    • 如果当前元素arr [i]是一个质子数,则将C增加1
    • 否则,以C *(C – 1)/ 2递增计数,以计算具有质子数的C元素的子数组的数目,并将C更新为0
  • count的值递增为C *(C – 1)/ 2
  • 完成上述步骤后,打印count的值作为结果。

下面是上述方法的实现:

C++
// C++ program for the approach
#include 
#include 
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 aray
    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 aray
    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 aray
    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 aray
    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


输出
3

时间复杂度: O(N * sqrt(M)),其中M数组中存在最大元素
辅助空间: O(1)