Open In App

Maximum number of contiguous array elements with same number of set bits

Last Updated : 15 Nov, 2022
Comments
Improve
Suggest changes
Like Article
Like
Report

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)


Next Article
Practice Tags :

Similar Reads