给定数组arr [] ,任务是将具有sum的子数组视为一个完美的立方体。
例子:
Input: arr[] = {6, 10, 9, 2, 1, 113}
Output: 3
Explanation:
Possible subarrays are –
{{1}, {6, 10, 9, 2, 1}, {9, 2, 1, 113}}
Input: arr[] = {1}
Output: 1
Explanation:
There is only one such subarray whose sum is a perfect cube
方法:想法是找到数组的前缀和,以便可以在O(1)中计算任何子数组的和。然后遍历每个可能的子数组,并检查子数组的总和是否为理想的立方体,如果是,则将计数加1。
下面是上述方法的实现:
C++
// C++ implementationn to count
// subarrays having sum
// as a perfect cube
#include
using namespace std;
#define int long long
// Function to check for
// perfect cube or not
bool isCubicSquare(int x)
{
int curoot = round(pow(x, 1.0 / 3.0));
if (curoot * curoot * curoot == x)
return true;
return false;
}
// Function to count the subarray
// whose sum is a perfect cube
int count(int arr[], int n)
{
int pre[n + 1];
pre[0] = 0;
// Loop to find the prefix sum
// of the array
for (int i = 1; i <= n; i++) {
pre[i] = pre[i - 1] + arr[i - 1];
}
int ans = 0;
// Loop to take every
// possible subarrays
for (int i = 0; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
// check for every
// possible subarrays
if (isCubicSquare((double)
(pre[j] - pre[i]))) {
ans++;
}
}
}
return ans;
}
// Driver Code
int32_t main()
{
int arr[6] = { 6, 10, 9, 2, 1, 113 };
cout << count(arr, 6);
return 0;
}
Java
// Java implementationn to count subarrays
// having sum as a perfect cube
import java.lang.Math;
class GFG{
// Function to check for
// perfect cube or not
public static boolean isCubicSquare(int x)
{
double curoot = Math.round(
Math.pow(x, 1.0 / 3.0));
if (curoot * curoot * curoot == x)
return true;
return false;
}
// Function to count the subarray
// whose sum is a perfect cube
public static int count(int arr[], int n)
{
int[] pre = new int[n + 1];
pre[0] = 0;
// Loop to find the prefix sum
// of the array
for(int i = 1; i <= n; i++)
{
pre[i] = pre[i - 1] + arr[i - 1];
}
int ans = 0;
// Loop to take every
// possible subarrays
for(int i = 0; i <= n; i++)
{
for(int j = i + 1; j <= n; j++)
{
// Check for every
// possible subarrays
if (isCubicSquare((pre[j] - pre[i])))
{
ans++;
}
}
}
return ans;
}
// Driver code
public static void main(String[] args)
{
int arr[] = { 6, 10, 9, 2, 1, 113 };
System.out.print(count(arr, 6));
}
}
// This code is contributed by divyeshrabadiya07
Python3
# Python3 implementationn to count
# subarrays having sum
# as a perfect cube
# Function to check for
# perfect cube or not
def isCubicSquare(x):
curoot = round(pow(x,
1.0 / 3.0))
if (curoot * curoot *
curoot == x):
return True
return False
# Function to count the subarray
# whose sum is a perfect cube
def count(arr, n):
pre = [0] * (n + 1)
pre[0] = 0
# Loop to find the prefix
# sum of the array
for i in range (1, n + 1):
pre[i] = pre[i - 1] + arr[i - 1]
ans = 0
# Loop to take every
# possible subarrays
for i in range (n + 1):
for j in range (i + 1, n + 1):
# Check for every
# possible subarrays
if (isCubicSquare((pre[j] -
pre[i]))):
ans += 1
return ans
# Driver Code
if __name__ == "__main__":
arr = [6, 10, 9, 2, 1, 113]
print (count(arr, 6))
# This code is contributed by Chitranayal
C#
// C# implementationn to count subarrays
// having sum as a perfect cube
using System;
class GFG{
// Function to check for
// perfect cube or not
public static bool isCubicSquare(int x)
{
double curoot = Math.Round(
Math.Pow(x, 1.0 / 3.0));
if (curoot * curoot * curoot == x)
return true;
return false;
}
// Function to count the subarray
// whose sum is a perfect cube
public static int count(int []arr, int n)
{
int[] pre = new int[n + 1];
pre[0] = 0;
// Loop to find the prefix sum
// of the array
for(int i = 1; i <= n; i++)
{
pre[i] = pre[i - 1] + arr[i - 1];
}
int ans = 0;
// Loop to take every
// possible subarrays
for(int i = 0; i <= n; i++)
{
for(int j = i + 1; j <= n; j++)
{
// Check for every
// possible subarrays
if (isCubicSquare((pre[j] - pre[i])))
{
ans++;
}
}
}
return ans;
}
// Driver code
public static void Main()
{
int []arr = { 6, 10, 9, 2, 1, 113 };
Console.Write(count(arr, 6));
}
}
// This code is contributed by Code_Mech
输出:
3
性能分析:
- 时间复杂度: O(N 2 )
- 辅助空间: O(N)