Find number of subarrays with even sum - GeeksforGeeks
Given an array, find the number of subarrays whose sum is even.
Read full article from Find number of subarrays with even sum - GeeksforGeeks
Given an array, find the number of subarrays whose sum is even.
O(n) Time and O(1) Space Method [Efficient]
If we do compute the cumulative sum array in temp[] of our input array, then we can see that the sub-array starting from i and ending at j, has an even sum if temp[] if (temp[j] – temp[i]) % 2 = 0. So, instead of building a cumulative sum array we build a cumulative sum modulo 2 array, and find how many times 0 and 1 appears in temp[] array using handshake formula. [n * (n-1) /2]
If we do compute the cumulative sum array in temp[] of our input array, then we can see that the sub-array starting from i and ending at j, has an even sum if temp[] if (temp[j] – temp[i]) % 2 = 0. So, instead of building a cumulative sum array we build a cumulative sum modulo 2 array, and find how many times 0 and 1 appears in temp[] array using handshake formula. [n * (n-1) /2]
int
countEvenSum(
int
arr[],
int
n)
{
// A temporary array of size 2. temp[0] is
// going to store count of even subarrays
// and temp[1] count of odd.
// temp[0] is initialized as 1 because there
// a single even element is also counted as
// a subarray
int
temp[2] = {1, 0};
// Initialize count. sum is sum of elements
// under modulo 2 and ending with arr[i].
int
result = 0, sum = 0;
// i'th iteration computes sum of arr[0..i]
// under modulo 2 and increments even/odd count
// according to sum's value
for
(
int
i=0; i<=n-1; i++)
{
// 2 is added to handle negative numbers
sum = ( (sum + arr[i]) % 2 + 2) % 2;
// Increment even/odd count
temp[sum]++;
}
// Use handshake lemma to count even subarrays
// (Note that an even cam be formed by two even
// or two odd)
result = result + (temp[0]*(temp[0]-1)/2);
result = result + (temp[1]*(temp[1]-1)/2);
return
(result);
}
O(n2) time and O(1) space method [Brute Force]
We can simply generate all the possible sub-arrays and find whether the sum of all the elements in them is an even or not. If it is even then we will count that sub-array otherwise neglect it.
We can simply generate all the possible sub-arrays and find whether the sum of all the elements in them is an even or not. If it is even then we will count that sub-array otherwise neglect it.
int
countEvenSum(
int
arr[],
int
n)
{
int
result = 0;
// Find sum of all subarrays and increment
// result if sum is even
for
(
int
i=0; i<=n-1; i++)
{
int
sum = 0;
for
(
int
j=i; j<=n-1; j++)
{
sum = sum + arr[j];
if
(sum % 2 == 0)
result++;
}
}
return
(result);
}