给定N个整数的数组arr [] ,任务是查找具有负积的子数组的数量。
例子:
Input: arr[] = {-1, 2, -2}
Output: 4
Subarray with negative product are {-1}, {-2}, {-1, 2} and {2, -2}.
Input: arr[] = {5, -4, -3, 2, -5}
Output: 8
方法:
- 将正数组元素替换为1 ,将负数组元素替换为-1 。
- 创建一个前缀乘积数组pre [] ,其中pre [i]存储从索引arr [0]到arr [i]的所有元素的乘积。
- 现在,可以注意到,只有当pre [i] * pre [j]为负时,子阵列arr [i…j]才为负。
- 因此,具有负乘积的子数组的总计数将是前缀乘积数组中正和负元素计数的乘积。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function to return the count of
// subarrays with negative product
int negProdSubArr(int arr[], int n)
{
int positive = 1, negative = 0;
for (int i = 0; i < n; i++) {
// Replace current element with 1
// if it is positive else replace
// it with -1 instead
if (arr[i] > 0)
arr[i] = 1;
else
arr[i] = -1;
// Take product with previous element
// to form the prefix product
if (i > 0)
arr[i] *= arr[i - 1];
// Count positive and negative elements
// in the prefix product array
if (arr[i] == 1)
positive++;
else
negative++;
}
// Return the required count of subarrays
return (positive * negative);
}
// Driver code
int main()
{
int arr[] = { 5, -4, -3, 2, -5 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << negProdSubArr(arr, n);
return (0);
}
Java
// Java implementation of the approach
class GFG
{
// Function to return the count of
// subarrays with negative product
static int negProdSubArr(int arr[], int n)
{
int positive = 1, negative = 0;
for (int i = 0; i < n; i++)
{
// Replace current element with 1
// if it is positive else replace
// it with -1 instead
if (arr[i] > 0)
arr[i] = 1;
else
arr[i] = -1;
// Take product with previous element
// to form the prefix product
if (i > 0)
arr[i] *= arr[i - 1];
// Count positive and negative elements
// in the prefix product array
if (arr[i] == 1)
positive++;
else
negative++;
}
// Return the required count of subarrays
return (positive * negative);
}
// Driver code
public static void main (String[] args)
{
int arr[] = { 5, -4, -3, 2, -5 };
int n = arr.length;
System.out.println(negProdSubArr(arr, n));
}
}
// This code is contributed by AnkitRai01
Python3
# Python3 implementation of the approach
# Function to return the count of
# subarrays with negative product
def negProdSubArr(arr, n):
positive = 1
negative = 0
for i in range(n):
# Replace current element with 1
# if it is positive else replace
# it with -1 instead
if (arr[i] > 0):
arr[i] = 1
else:
arr[i] = -1
# Take product with previous element
# to form the prefix product
if (i > 0):
arr[i] *= arr[i - 1]
# Count positive and negative elements
# in the prefix product array
if (arr[i] == 1):
positive += 1
else:
negative += 1
# Return the required count of subarrays
return (positive * negative)
# Driver code
arr = [5, -4, -3, 2, -5]
n = len(arr)
print(negProdSubArr(arr, n))
# This code is contributed by Mohit Kumar
C#
// C# implementation of the approach
using System;
class GFG
{
// Function to return the count of
// subarrays with negative product
static int negProdSubArr(int []arr, int n)
{
int positive = 1, negative = 0;
for (int i = 0; i < n; i++)
{
// Replace current element with 1
// if it is positive else replace
// it with -1 instead
if (arr[i] > 0)
arr[i] = 1;
else
arr[i] = -1;
// Take product with previous element
// to form the prefix product
if (i > 0)
arr[i] *= arr[i - 1];
// Count positive and negative elements
// in the prefix product array
if (arr[i] == 1)
positive++;
else
negative++;
}
// Return the required count of subarrays
return (positive * negative);
}
// Driver code
static public void Main ()
{
int []arr = { 5, -4, -3, 2, -5 };
int n = arr.Length;
Console.Write(negProdSubArr(arr, n));
}
}
// This code is contributed by Sachin.
输出:
8