Given an array arr[] with N integers, find the number of triplets of i, j and k such that 1<= i < j < k <= N and arr[i] + arr[j] + arr[k] is odd.
Example:
Input: arr[] = {1, 2, 3, 4, 5}
Output: 4
Explanation: The given array contains 4 triplets with an odd sum. They are {1, 2, 4}, {1, 3, 5}, {2, 3, 4} and {2, 4, 5}.Input: arr[] ={4, 5, 6, 4, 5, 10, 1, 7}
Output: 28
Naive Approach: The given problem can be solved by iterating over all possible unordered triplets in the array and keep a track of the number of triplets such that their sum is odd.
Time Complexity: O(N3)
Efficient Approach: The above approach can be optimized using the below property of integers:
- odd + even + even = odd
- odd + odd + odd = odd
Therefore, to implement the above idea, we can count the number of even and odd integers in the array. Suppose the count of odd integers is O and the count of even integers is E. So the distinct ways to arrange one odd integer and two even integers is OC1 * EC2 -> (O * E * (E-1))/2 and the distinct ways to arrange three odd integers is OC3 -> (O * (O-1) * (O-2)) / 6. The final answer will be the sum of the above two values.
Below is the implementation of the above approach:
// C++ Program for the above approach #include <iostream> using namespace std;
// Function to count the number of // unordered triplets such that their // sum is an odd integer int countTriplets( int arr[], int n)
{ // Count the number of odd and
// even integers in the array
int odd = 0, even = 0;
for ( int i = 0; i < n; i++) {
if (arr[i] & 1)
odd++;
else
even++;
}
// Number of ways to create triplets
// using one odd and two even integers
int c1 = odd * (even * (even - 1)) / 2;
// Number of ways to create triplets
// using three odd integers
int c2 = (odd * (odd - 1) * (odd - 2)) / 6;
// Return answer
return c1 + c2;
} // Driver Code int main()
{ int arr[] = { 4, 5, 6, 4, 5, 10, 1, 7 };
int n = sizeof (arr) / sizeof ( int );
// Function Call
int ans = countTriplets(arr, n);
// Print Answer
cout << ans;
return 0;
} |
// Java program for the above approach import java.io.*;
class GFG {
// Function to count the number of // unordered triplets such that their // sum is an odd integer static int countTriplets( int arr[], int n)
{ // Count the number of odd and
// even integers in the array
int odd = 0 , even = 0 ;
for ( int i = 0 ; i < n; i++) {
if ((arr[i] & 1 ) != 0 )
odd++;
else
even++;
}
// Number of ways to create triplets
// using one odd and two even integers
int c1 = odd * (even * (even - 1 )) / 2 ;
// Number of ways to create triplets
// using three odd integers
int c2 = (odd * (odd - 1 ) * (odd - 2 )) / 6 ;
// Return answer
return c1 + c2;
} // Driver code public static void main(String[] args)
{ int arr[] = { 4 , 5 , 6 , 4 , 5 , 10 , 1 , 7 };
int n = arr.length;
// Function Call
int ans = countTriplets(arr, n);
// Print Answer
System.out.println(ans);
} } // This code is contributed by code_hunt. |
# Python Program for the above approach # Function to count the number of # unordered triplets such that their # sum is an odd integer def countTriplets(arr, n):
# Count the number of odd and
# even integers in the array
odd = 0
even = 0
for i in range (n):
if (arr[i] & 1 ):
odd + = 1
else :
even + = 1
# Number of ways to create triplets
# using one odd and two even integers
c1 = odd * (even * (even - 1 )) / / 2
# Number of ways to create triplets
# using three odd integers
c2 = (odd * (odd - 1 ) * (odd - 2 )) / / 6
# Return answer
return c1 + c2
# Driver Code arr = [ 4 , 5 , 6 , 4 , 5 , 10 , 1 , 7 ]
n = len (arr)
# Function Call ans = countTriplets(arr, n)
# Print Answer print (ans)
# This code is contributed by Shivani |
// C# program for the above approach using System;
class GFG{
// Function to count the number of unordered // triplets such that their sum is an odd integer static int countTriplets( int []arr, int n)
{ // Count the number of odd and
// even integers in the array
int odd = 0, even = 0;
for ( int i = 0; i < n; i++)
{
if ((arr[i] & 1) != 0)
odd++;
else
even++;
}
// Number of ways to create triplets
// using one odd and two even integers
int c1 = odd * (even * (even - 1)) / 2;
// Number of ways to create triplets
// using three odd integers
int c2 = (odd * (odd - 1) * (odd - 2)) / 6;
// Return answer
return c1 + c2;
} // Driver code public static void Main(String[] args)
{ int []arr = { 4, 5, 6, 4, 5, 10, 1, 7 };
int n = arr.Length;
// Function Call
int ans = countTriplets(arr, n);
// Print Answer
Console.Write(ans);
} } // This code is contributed by shivanisinghss2110. |
<script> // JavaScript program for the above approach;
// Function to count the number of
// unordered triplets such that their
// sum is an odd integer
function countTriplets(arr, n)
{
// Count the number of odd and
// even integers in the array
let odd = 0, even = 0;
for (let i = 0; i < n; i++) {
if (arr[i] & 1)
odd++;
else
even++;
}
// Number of ways to create triplets
// using one odd and two even integers
let c1 = Math.floor(odd * (even * (even - 1)) / 2);
// Number of ways to create triplets
// using three odd integers
let c2 = Math.floor((odd * (odd - 1) * (odd - 2)) / 6);
// Return answer
return c1 + c2;
}
// Driver Code
let arr = [4, 5, 6, 4, 5, 10, 1, 7];
let n = arr.length;
// Function Call
let ans = countTriplets(arr, n);
// Print Answer
document.write(ans);
// This code is contributed by Potta Lokesh
</script>
|
28
Time Complexity: O(N)
Auxiliary Space: O(1)