Given an array with n elements. The task is to find the maximum number of contiguous array elements which have the same number of set bits.
Examples:
Input : arr[] = {14, 1, 2, 32, 12, 10} Output : 3 Elements 1, 2, 32 have same number of set bits and are contiguous. Input : arr[] = {1, 6, 9, 15, 8} Output : 2 Elements 6, 9 have same number of set bits.
Approach:
- Traverse the array from left to right and store the number of set bits of each element in a vector.
- Our task is reduced in finding the longest chain of same elements in this vector.
- Maintain two variables, current_count and max_count. Initialise both of them with 1.
- Traverse the vector and check if current element is same as previous element. If it is same, increment current_count. If it is not same, then reinitialize current_count with 1.
- At each step, max_count must be assigned maximum value between max_count and current_count.
- Final value of max_count is the answer.
Below is the implementation of the above approach:
C++
// C++ program to find the maximum number of // contiguous array elements with same // number of set bits #include <bits/stdc++.h> using namespace std;
// Function to find maximum contiguous elements // with same set bits int sameSetBits( int arr[], int n)
{ vector< int > v;
// Insert number of set bits in each element
// of the array to the vector
// __builtin_popcount() function returns the number
// of set bits in an integer in C++
for ( int i = 0; i < n; i++)
v.push_back(__builtin_popcount(arr[i]));
int current_count = 1, max_count = 1;
// Finding the maximum number of same
// contiguous elements
for ( int i = 1; i < v.size(); i++) {
if (v[i + 1] == v[i])
current_count++;
else
current_count = 1;
max_count = max(max_count, current_count);
}
// return answer
return max_count;
} // Driver code int main()
{ int arr[] = { 9, 75, 14, 7, 13, 11 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << sameSetBits(arr, n);
return 0;
} |
Java
// Java program to find the maximum // number of contiguous array elements // with same number of set bits import java.io.*;
import java.util.*;
class GFG
{ // Function to find maximum contiguous
// elements with same set bits
static int sameSetBits( int arr[], int n)
{
Vector<Integer> v = new Vector<>();
// Insert number of set bits in each element
// of the array to the vector
for ( int i = 0 ; i < n; i++)
{
int count = Integer.bitCount(arr[i]);
v.add(count);
}
int current_count = 1 , max_count = 1 ;
// Finding the maximum number of same
// contiguous elements
for ( int i = 1 ; i < v.size()- 1 ; i++)
{
if (v.get(i + 1 ) == v.get(i))
current_count++;
else
current_count = 1 ;
max_count = Math.max(max_count, current_count);
}
// return answer
return max_count;
}
// Driver code
public static void main (String[] args)
{
int arr[] = { 9 , 75 , 14 , 7 , 13 , 11 };
int n = arr.length;
System.out.println(sameSetBits(arr, n));
}
} // This code is contributed by Archana_kumari |
Python3
# Python 3 program to find the maximum # number of contiguous array elements # with same number of set bits # Function to find maximum contiguous # elements with same set bits def sameSetBits(arr, n):
v = []
# Insert number of set bits in each
# element of the array to the vector
# function returns the number of set
# bits in an integer
for i in range ( 0 , n, 1 ):
v.append( bin (arr[i]).count( '1' ))
current_count = 1
max_count = 1
# Finding the maximum number of same
# contiguous elements
for i in range ( 1 , len (v) - 1 , 1 ):
if (v[i + 1 ] = = v[i]):
current_count + = 1
else :
current_count = 1
max_count = max (max_count,
current_count)
# return answer
return max_count
# Driver code if __name__ = = '__main__' :
arr = [ 9 , 75 , 14 , 7 , 13 , 11 ]
n = len (arr)
print (sameSetBits(arr, n))
# This code is contributed by # Surendra_Gangwar |
C#
// C# program to find the maximum // number of contiguous array elements // with same number of set bits using System;
using System.Collections.Generic;
class GFG
{ // Function to find maximum contiguous
// elements with same set bits
static int sameSetBits( int []arr, int n)
{
List< int > v = new List< int >();
// Insert number of set bits in each element
// of the array to the vector
for ( int i = 0; i < n; i++)
{
int count = Bitcount(arr[i]);
v.Add(count);
}
int current_count = 1, max_count = 1;
// Finding the maximum number of same
// contiguous elements
for ( int i = 1; i < v.Count-1; i++)
{
if (v[i + 1] == v[i])
current_count++;
else
current_count = 1;
max_count = Math.Max(max_count, current_count);
}
// return answer
return max_count;
}
static int Bitcount( int n)
{
int count = 0;
while (n != 0)
{
count++;
n &= (n - 1);
}
return count;
}
// Driver code
public static void Main (String[] args)
{
int []arr = { 9, 75, 14, 7, 13, 11 };
int n = arr.Length;
Console.WriteLine(sameSetBits(arr, n));
}
} // This code has been contributed by 29AjayKumar |
Javascript
<script> // Javascript program to find the maximum number of // contiguous array elements with same // number of set bits function Bitcount(n)
{ var count = 0;
while (n != 0)
{
count++;
n &= (n - 1);
}
return count;
} // Function to find maximum contiguous elements // with same set bits function sameSetBits(arr, n)
{ var v = [];
// Insert number of set bits in each element
// of the array to the vector
// Bitcount function returns the number
// of set bits in an integer in C++
for ( var i = 0; i < n; i++)
v.push(Bitcount(arr[i]));
var current_count = 1, max_count = 1;
// Finding the maximum number of same
// contiguous elements
for ( var i = 1; i < v.length; i++) {
if (v[i + 1] == v[i])
current_count++;
else
current_count = 1;
max_count = Math.max(max_count, current_count);
}
// return answer
return max_count;
} // Driver code var arr = [ 9, 75, 14, 7, 13, 11 ];
var n = arr.length;
document.write( sameSetBits(arr, n)); </script> |
Output
4
Time Complexity: O(n), since __builtin_popcount has a maximum complexity of 32 for each int value.
Auxiliary Space: O(n)