给定一个数组arr [] ,任务是计算所有子数组,其总和可以表示为任意两个数字的平方差。
例子:
Input: arr[] = {1, 2, 3}
Output: 4
Explanation:
Required sub-arrays are {1}, {3}, {1, 2} and {2, 3}
As 12 – 02 = 1, 22 – 12 = 3, 2+3=5=> 32 – 22 = 5
Input: arr[] = {2, 1, 3, 7}
Output: 7
Required sub-arrays are –
{1}, {3}, {7}, {2, 1}, {2, 1, 3, 7}, {1, 3} and {1, 3, 7}
方法:这个想法是利用一个事实,即奇数或被4整除的数字只能表示为2个数字的平方差。下面是步骤说明:
- 运行嵌套循环并检查每个子数组是否可以将sum写入两个数字的平方差。
- 如果任何子数组的总和可以表示为两个数字的平方之差,则将这些子数组的计数增加1
下面是上述方法的实现:
C++
// C++ implementation to count the
// subarray which can be represented
// as the difference of two square
// of two numbers
#include
using namespace std;
#define ll long long
// Function to count sub-arrays whose
// sum can be represented as difference
// of squares of 2 numbers
int countSubarray(int* arr, int n)
{
int count = 0;
for (int i = 0; i < n; i++) {
// Count the elements that
// are odd and divisible by 4
if (arr[i] % 2 != 0 || arr[i] % 4 == 0)
count++;
// Declare a variable to store sum
ll sum = arr[i];
for (int j = i + 1; j < n; j++) {
// Calculate sum of
// current subarray
sum += arr[j];
if (sum % 2 != 0 || sum % 4 == 0)
count++;
}
}
return count;
}
// Driver Code
int main()
{
int arr[] = { 2, 1, 3, 7 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << countSubarray(arr, n) << endl;
return 0;
}
Java
// Java implementation to count the
// subarray which can be represented
// as the difference of two square
// of two numbers
import java.util.*;
class GFG {
// Function to count sub-arrays whose
// sum can be represented as difference
// of squares of 2 numbers
static int countSubarray(int[] arr, int n)
{
int count = 0;
for (int i = 0; i < n; i++) {
// Count the elements that
// are odd and divisible by 4
if (arr[i] % 2 != 0 || arr[i] % 4 == 0)
count++;
// Declare a variable to store sum
long sum = arr[i];
for (int j = i + 1; j < n; j++) {
// Calculate sum of
// current subarray
sum += arr[j];
if (sum % 2 != 0 || sum % 4 == 0)
count++;
}
}
return count;
}
// Driver code
public static void main(String[] args)
{
int arr[] = { 2, 1, 3, 7 };
int n = arr.length;
System.out.println(countSubarray(arr, n));
}
}
Python 3
# Python implementation to
# count the sub-arrays whose
# sum can be reperesented as
# difference of square of two
# numbers
# Function to count sub-arrays whose
# sum can be represented as
# difference of squares of 2 numbers
def countSubarray(arr, n):
count = 0
for i in range(n):
# Count the elements that
# are odd or divisible by 4
if arr[i]% 2 != 0 or arr[i]% 4 == 0:
count+= 1
# Declare a variable to store sum
tot = arr[i]
for j in range(i + 1, n):
# Calculate sum of
# current subarray
tot+= arr[j]
if tot % 2 != 0 or tot % 4 == 0:
count+= 1
return count
# Driver Code
if __name__ == "__main__":
arr = [ 2, 1, 3, 7 ]
n = len(arr)
print(countSubarray(arr, n))
C#
// C# implementation to count the
// subarray which can be represented
// as the difference of two square
// of two numbers
using System;
class GFG {
// Function to count sub-arrays whose
// sum can be represented as difference
// of squares of 2 numbers
static int countSubarray(int[] arr, int n)
{
int count = 0;
for (int i = 0; i < n; i++) {
// Count the elements that
// are odd and divisible by 4
if (arr[i] % 2 != 0 || arr[i] % 4 == 0)
count++;
// Declare a variable to store sum
long sum = arr[i];
for (int j = i + 1; j < n; j++) {
// Calculate sum of
// current subarray
sum += arr[j];
if (sum % 2 != 0 || sum % 4 == 0)
count++;
}
}
return count;
}
// Driver Code
public static void Main()
{
int[] arr = { 2, 1, 3, 7 };
int n = arr.Length;
Console.WriteLine(countSubarray(arr, n));
}
}
PHP
输出:
7
时间复杂度: O(N 2 )