Given an array A[] of size N, the task is to check if it is possible to get odd sum using K distinct elements from the array.
Examples:
Input: N = 4, K = 2, A = {10, 19, 14, 14}
Output: YES
Explanation:
19 + 14 = 33, which is oddInput: N = 3, K = 3, A = {101, 102, 103}
Output: NO
Explanation:
101 + 102 + 103 = 306, which is even
Approach:
- Let us look at some basic maths properties:
EVEN + EVEN = EVEN ODD + ODD = EVEN EVEN + ODD = ODD
- From the above properties, we can conclude that when an odd number of odd integers are added to any number of even integers, the result will always be odd.
Examples:
- 3 + 2 + 6 = 11 (odd)
- 1 + 3 + 7 + 4 = 15 (odd)
Hence, follow the steps below to solve the problem:
- Count distinct odd and even elements present in the array.
- If K or more odd elements are present in the array, print “Yes”.
- Otherwise, for every odd count of odd numbers, check if sufficient even numbers are present in the array or not.
- If any such case occurs, print “Yes”. Otherwise, print “No”.
Below is the implementation of the above approach:
C++
// C++ program for above approach #include <bits/stdc++.h> using namespace std;
// Function to return if // odd sum is possible or not bool oddSum(vector< int >& A,
int N, int K)
{ // Stores distinct odd elements
set< int > Odd;
// Stores distinct even elements
set< int > Even;
// Iterating through given array
for ( int i = 0; i < N; i++) {
// If element is even
if (A[i] % 2 == 0) {
Even.insert(A[i]);
}
// If element is odd
else {
Odd.insert(A[i]);
}
}
// If atleast K elements
// in the array are odd
if (Odd.size() >= K)
return true ;
bool flag = false ;
// Check for all odd frequencies
// of odd elements whether
// sufficient even numbers
// are present or not
for ( int i = 1; i < K; i += 2) {
// Count of even numbers
// required
int needed = K - i;
// If required even numbers
// are present in the array
if (needed <= Even.size()) {
return true ;
}
}
return flag;
} // Driver Program int main()
{ int N = 5;
vector< int > A = { 12, 1, 7, 7, 26, 18 };
int K = 3;
if (oddSum(A, N, K))
cout << "YES" ;
else
cout << "NO" ;
return 0;
} |
Java
// Java program for the above approach import java.util.*;
class GFG{
// Function to return if // odd sum is possible or not static boolean oddSum( int []A,
int N, int K)
{ // Stores distinct odd elements
HashSet<Integer> Odd = new HashSet<Integer>();
// Stores distinct even elements
HashSet<Integer> Even = new HashSet<Integer>();
// Iterating through given array
for ( int i = 0 ; i < N; i++)
{
// If element is even
if (A[i] % 2 == 0 )
{
Even.add(A[i]);
}
// If element is odd
else
{
Odd.add(A[i]);
}
}
// If atleast K elements
// in the array are odd
if (Odd.size() >= K)
return true ;
boolean flag = false ;
// Check for all odd frequencies
// of odd elements whether
// sufficient even numbers
// are present or not
for ( int i = 1 ; i < K; i += 2 )
{
// Count of even numbers
// required
int needed = K - i;
// If required even numbers
// are present in the array
if (needed <= Even.size())
{
return true ;
}
}
return flag;
} // Driver code public static void main(String[] args)
{ int N = 5 ;
int []A = { 12 , 1 , 7 , 7 , 26 , 18 };
int K = 3 ;
if (oddSum(A, N, K))
System.out.print( "YES" );
else
System.out.print( "NO" );
} } // This code is contributed by PrinciRaj1992 |
Python3
# Python3 program for # the above approach # Function to return if # odd sum is possible or not def oddSum(A, N, K):
# Stores distinct odd elements
Odd = set ([])
# Stores distinct even elements
Even = set ([])
# Iterating through given array
for i in range (N):
# If element is even
if (A[i] % 2 = = 0 ):
Even.add(A[i])
# If element is odd
else :
Odd.add(A[i])
# If atleast K elements
# in the array are odd
if ( len (Odd) > = K):
return True
flag = False
# Check for all odd frequencies
# of odd elements whether
# sufficient even numbers
# are present or not
for i in range ( 1 , K, 2 ):
# Count of even numbers
# required
needed = K - i
# If required even numbers
# are present in the array
if (needed < = len (Even)):
return True
return flag
# Driver Program if __name__ = = "__main__" :
N = 5
A = [ 12 , 1 , 7 ,
7 , 26 , 18 ]
K = 3
if (oddSum(A, N, K)):
print ( "YES" )
else :
print ( "NO" )
# This code is contributed by Chitranayal |
C#
// C# program for the above approach using System;
using System.Collections.Generic;
class GFG{
// Function to return if // odd sum is possible or not static bool oddSum( int []A, int N, int K)
{ // Stores distinct odd elements
HashSet< int > Odd = new HashSet< int >();
// Stores distinct even elements
HashSet< int > Even = new HashSet< int >();
// Iterating through given array
for ( int i = 0; i < N; i++)
{
// If element is even
if (A[i] % 2 == 0)
{
Even.Add(A[i]);
}
// If element is odd
else
{
Odd.Add(A[i]);
}
}
// If atleast K elements
// in the array are odd
if (Odd.Count >= K)
return true ;
bool flag = false ;
// Check for all odd frequencies
// of odd elements whether
// sufficient even numbers
// are present or not
for ( int i = 1; i < K; i += 2)
{
// Count of even numbers
// required
int needed = K - i;
// If required even numbers
// are present in the array
if (needed <= Even.Count)
{
return true ;
}
}
return flag;
} // Driver code public static void Main(String[] args)
{ int N = 5;
int []A = { 12, 1, 7, 7, 26, 18 };
int K = 3;
if (oddSum(A, N, K))
Console.Write( "YES" );
else
Console.Write( "NO" );
} } // This code is contributed by PrinciRaj1992 |
Javascript
<script> // JavaScript program for the above approach // Function to return if
// odd sum is possible or not
function oddSum(A,N,K)
{
// Stores distinct odd elements
let Odd = new Set();
// Stores distinct even elements
let Even = new Set();
// Iterating through given array
for (let i = 0; i < N; i++)
{
// If element is even
if (A[i] % 2 == 0)
{
Even.add(A[i]);
}
// If element is odd
else
{
Odd.add(A[i]);
}
}
// If atleast K elements
// in the array are odd
if (Odd.size >= K)
return true ;
let flag = false ;
// Check for all odd frequencies
// of odd elements whether
// sufficient even numbers
// are present or not
for (let i = 1; i < K; i += 2)
{
// Count of even numbers
// required
let needed = K - i;
// If required even numbers
// are present in the array
if (needed <= Even.size)
{
return true ;
}
}
return flag;
}
// Driver code
let N = 5;
let A=[12, 1, 7, 7, 26, 18];
let K = 3;
if (oddSum(A, N, K))
document.write( "YES" );
else
document.write( "NO" );
// This code is contributed by avanitrachhadiya2155 </script> |
Output:
NO
Time complexity: O(N)
Auxiliary space: O(N)