Given an **integer N, **the task is to find the maximum frequency of set bits among all pairs of integers from 0 to N that yields a sum as N.
Examples:
_Input: _N = 5
_Output: _3
Explanation:
All the pairs are {0, 5}, {1, 4}, {2, 3} which has a sum as 5.
0 (0000) and 5 (0101), number of set bit = 2
1 (0001) and 4 (0100), number of set bit = 2
2 (0010) and 3 (0011), number of set bit = 3, hence 3 is the maximum.
_Input: _N = 11
_Output: _4
Explanation:
_All the pairs are {0, 11}, {1, 10}, {2, 9}, {3, 8}, {4, 7}, {5, 6} and the maximum ans will be for the pair {4, 7} _
4 = 1000 and 7 = 0111, total number of set bits=1+3=4
**Naive Approach: **The simplest way to solve this problem is to generate all possible pairs with sum **N **and compute the maximum sum of the set bits of all such pairs, and print the maximum no of set bits sum.
**Time Complexity: **O(N * log N)
Auxiliary Space: O(1)
**Efficient Approach: **The above approach can be optimized through these steps:
Below is the implementation of the above approach:
// C++ program for the above approach
#include <bits/stdc++.h>
**using**
**namespace**
std;
// Function to find the first number
**int**
create_first_no(``**int**
n)
{
// Length of the binary from
**int**
length = 0;
// Number of set bits
**int**
freq_set_bits = 0;
**int**
ans = 0;
**while**
(n) {
// Update the first number
ans = ans << 1;
ans = ans + 1;
// Increment length
length++;
// Update the frequency
**if**
((n & 1))
freq_set_bits += 1;
n = n >> 1;
}
// Check if n does not have all the
// bits as set bits then make
// the first as less than n
**if**
(length != freq_set_bits)
ans = (ans >> 1);
// Return the first value
**return**
ans;
}
// Function to calculate maximum
// set bit frequency sum
**int**
maxSetBits(``**int**
n)
{
// First value of pair
**int**
first = create_first_no(n);
// Second value of pair
**int**
second = n - first;
// __builtin_popcount() is inbuilt
// function to count the number of set bits
**int**
freq_first
= __builtin_popcount(first);
**int**
freq_second
= __builtin_popcount(second);
// Return the sum of freq of setbits
**return**
freq_first + freq_second;
}
// Driver Code
**int**
main()
{
**int**
N = 5;
// Function call
cout << maxSetBits(N);
**return**
0;
}
Output:
3
_Time Complexity: _O(logN)
_Auxiliary Space: _O(1)
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.
#arrays #bit magic #hash #mathematical #binary-representation #setbitcount