Find the maximum sum pair in an Array with even parity
Given an array arr[] of N integers, the task is to find a pair with even parity and maximum sum.
Examples:
Input: arr[] = {18, 15, 8, 9, 14}
Output: 18 15
Explanation:
Binary Representation of elements –
18 => 10010, Parity = 2
15 => 1111, Parity = 4
8 => 1000, Parity = 1
9 => 1001, Parity = 2
14 => 1110, Parity = 3
Here, parity for elements 18, 15 and 9 are even
Hence, pair with maximum sum will be 18 and 15
Input: arr[] = {5, 3, 4, 2, 9}
Output: 9 5
Explanation:
The array contains three even parity values 5, 3 and 9.
Hence, pair with maximum sum will be 9 and 5.
Approach: The key observation in the problem is if we choose two maximum numbers with even parity, then it will be the desired answer.
Traverse the array and check if the current element is having even parity. Then, update the two maximum numbers with even parity.
if (findParity(arr[i]) % 2 == 0)
if (arr[i] >= firstMaximum)
secondMaximum = firstMaximum
firstMaximum = arr[i]
elif (arr[i] >= secondMaximum)
secondMaximum = arr[i]
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
const int sz = 1e3;
bool isEvenParity( int x)
{
int parity = 0;
while (x != 0) {
if (x & 1)
parity++;
x = x >> 1;
}
if (parity % 2 == 0)
return true ;
else
return false ;
}
void printArray( int arr[], int len)
{
for ( int i = 0; i < len; i++) {
cout << arr[i] << ' ' ;
}
}
void findPairEvenParity(
int arr[], int len)
{
int firstMaximum = INT_MIN;
int secondMaximum = INT_MIN;
for ( int i = 0; i < len; i++) {
if (isEvenParity(arr[i])) {
if (arr[i] >= firstMaximum){
secondMaximum = firstMaximum;
firstMaximum = arr[i];
}
else if (arr[i] >= secondMaximum){
secondMaximum = arr[i];
}
}
}
cout << firstMaximum
<< " " << secondMaximum;
}
int main()
{
int arr[] = { 18, 15, 8, 9, 14 };
int len = sizeof (arr) / sizeof ( int );
findPairEvenParity(arr, len);
return 0;
}
|
Java
import java.util.*;
class GFG{
static int sz = ( int ) 1e3;
static boolean isEvenParity( int x)
{
int parity = 0 ;
while (x != 0 )
{
if (x % 2 == 1 )
parity++;
x = x >> 1 ;
}
if (parity % 2 == 0 )
return true ;
else
return false ;
}
static void printArray( int arr[],
int len)
{
for ( int i = 0 ; i < len; i++)
{
System.out.print(arr[i] + " " );
}
}
static void findPairEvenParity( int arr[],
int len)
{
int firstMaximum = Integer.MIN_VALUE;
int secondMaximum = Integer.MIN_VALUE;
for ( int i = 0 ; i < len; i++)
{
if (isEvenParity(arr[i]))
{
if (arr[i] >= firstMaximum)
{
secondMaximum = firstMaximum;
firstMaximum = arr[i];
}
else if (arr[i] >= secondMaximum)
{
secondMaximum = arr[i];
}
}
}
System.out.print(firstMaximum + " " +
secondMaximum);
}
public static void main(String[] args)
{
int arr[] = { 18 , 15 , 8 , 9 , 14 };
int len = arr.length;
findPairEvenParity(arr, len);
}
}
|
Python3
import sys
sz = 1e3
def isEvenParity(x):
parity = 0
while x ! = 0 :
if (x & 1 ):
parity = parity + 1 ;
x = x >> 1
if (parity % 2 = = 0 ):
return True
else :
return False
def printArray(arr, n):
for i in range ( 0 , n):
print (arr[i], end = ' ' )
def findPairEvenParity(arr, n):
firstMaximum = - 1
secondMaximum = - 1
for i in range ( 0 , n):
if isEvenParity(arr[i]) = = True :
if (arr[i] > = firstMaximum):
secondMaximum = firstMaximum
firstMaximum = arr[i]
elif (arr[i] > = secondMaximum):
secondMaximum = arr[i]
print (firstMaximum, secondMaximum)
if __name__ = = "__main__" :
arr = [ 18 , 15 , 8 , 9 , 14 ]
n = len (arr)
findPairEvenParity(arr, n)
|
C#
using System;
class GFG{
static int sz = ( int ) 1e3;
static bool isEvenParity( int x)
{
int parity = 0;
while (x != 0)
{
if (x % 2 == 1)
parity++;
x = x >> 1;
}
if (parity % 2 == 0)
return true ;
else
return false ;
}
static void printArray( int []arr,
int len)
{
for ( int i = 0; i < len; i++)
{
Console.Write(arr[i] + " " );
}
}
static void findPairEvenParity( int []arr,
int len)
{
int firstMaximum = Int32.MinValue;
int secondMaximum = Int32.MinValue;
for ( int i = 0; i < len; i++)
{
if (isEvenParity(arr[i]))
{
if (arr[i] >= firstMaximum)
{
secondMaximum = firstMaximum;
firstMaximum = arr[i];
}
else if (arr[i] >= secondMaximum)
{
secondMaximum = arr[i];
}
}
}
Console.Write(firstMaximum + " " +
secondMaximum);
}
public static void Main()
{
int []arr = { 18, 15, 8, 9, 14 };
int len = arr.Length;
findPairEvenParity(arr, len);
}
}
|
Javascript
<script>
let sz = 1e3;
function isEvenParity(x)
{
let parity = 0;
while (x != 0)
{
if (x % 2 == 1)
parity++;
x = x >> 1;
}
if (parity % 2 == 0)
return true ;
else
return false ;
}
function printArray(arr, len)
{
for (let i = 0; i < len; i++)
{
document.write(arr[i] + " " );
}
}
function findPairEvenParity(arr, len)
{
let firstMaximum = Number.MIN_VALUE;
let secondMaximum = Number.MIN_VALUE;
for (let i = 0; i < len; i++)
{
if (isEvenParity(arr[i]))
{
if (arr[i] >= firstMaximum)
{
secondMaximum = firstMaximum;
firstMaximum = arr[i];
}
else if (arr[i] >= secondMaximum)
{
secondMaximum = arr[i];
}
}
}
document.write(firstMaximum + " " +
secondMaximum);
}
let arr = [ 18, 15, 8, 9, 14 ];
let len = arr.length;
findPairEvenParity(arr, len);;
</script>
|
Time Complexity: O(n*log10 n)
Auxiliary Space: O(1)
Last Updated :
05 Jan, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...