Given an array arr[] consisting of N positive integers, the task is to find the length of the longest subarray having a product of elements of that subarray equal to a perfect power of 2.
Examples:
Input: arr[] = {2, 5, 4, 4, 6}
Output: 2
Explanation:
The subarray having maximum length whose product is perfect power of 2 is {4, 4}.
Product = 4 * 4 = 16, which is a perfect power of 2.
Input: arr[] = {2, 5, 4, 6, 8, 8, 2}
Output: 3
Explanation:
The subarray having maximum length whose product is perfect power of 2 is {8, 8, 2}.
Product = 8 * 8 * 2 = 128, which is a perfect power of 2.
Naive Approach: The simplest approach is to generate all possible subarrays of the given array and check if the product of the elements of any subarray is a perfect power of 2 or not. If found to be true, then update the maximum length to the length of this subarray. Finally, print the maximum length of the subarray obtained after checking all possible subarray.
Below is the code for above approach :
C++
#include <bits/stdc++.h>
using namespace std;
bool isPower( int x) {
return (x && (!(x & (x - 1))));
}
int maximumlength( int arr[], int N)
{
int max_len_subarray = 0;
for ( int i = 0; i < N; i++) {
int prod = 1;
for ( int j = i; j < N; j++) {
prod *= arr[j];
if (isPower(prod)) {
max_len_subarray
= max(max_len_subarray, j - i + 1);
}
}
}
cout << max_len_subarray;
}
int main()
{
int arr[] = { 2, 5, 4, 6, 8, 8, 2 };
int N = sizeof (arr) / sizeof (arr[0]);
maximumlength(arr, N);
return 0;
}
|
Java
import java.util.*;
public class GFG {
public static boolean isPower( int x) {
return (x != 0 ) && ((x & (x - 1 )) == 0 );
}
public static int maximumLength( int [] arr) {
int N = arr.length;
int max_len_subarray = 0 ;
for ( int i = 0 ; i < N; i++) {
int prod = 1 ;
for ( int j = i; j < N; j++) {
prod *= arr[j];
if (isPower(prod)) {
max_len_subarray = Math.max(max_len_subarray, j - i + 1 );
}
}
}
return max_len_subarray;
}
public static void main(String[] args) {
int [] arr = { 2 , 5 , 4 , 6 , 8 , 8 , 2 };
int maxLength = maximumLength(arr);
System.out.println(maxLength);
}
}
|
Python3
def is_power(x):
return x ! = 0 and (x & (x - 1 )) = = 0
def maximum_length(arr, N):
max_len_subarray = 0
for i in range (N):
prod = 1
for j in range (i, N):
prod * = arr[j]
if is_power(prod):
max_len_subarray = max (max_len_subarray, j - i + 1 )
return max_len_subarray
if __name__ = = "__main__" :
arr = [ 2 , 5 , 4 , 6 , 8 , 8 , 2 ]
N = len (arr)
max_length = maximum_length(arr, N)
print (max_length)
|
Time Complexity: O(N3)
Auxiliary Space: O(1)
Efficient Approach: To optimize the above approach, the idea is based upon the fact that for any number to be a power of 2 it can be also be expressed as the product of numbers having perfect power of 2. Therefore, the idea is to use the Kadane’s Algorithm to find the maximum length of the subarray having all elements having perfect power of 2. Below are the steps:
- Initialize maxLength and ans as 0 that will store the maximum length of subarrays and a resultant maximum length of subarray respectively.
- Traverse the given array and do the following:
- Print the value of ans as the maximum length after the above steps.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
bool isPower( int x)
{
return (x && (!(x & (x - 1))));
}
int maximumlength( int arr[], int N)
{
int max_length = 0;
int max_len_subarray = 0;
for ( int i = 0; i < N; i++) {
if (isPower(arr[i]) == 1) {
max_length++;
max_len_subarray
= max(max_length,
max_len_subarray);
}
else {
max_length = 0;
}
}
cout << max_len_subarray;
}
int main()
{
int arr[] = { 2, 5, 4, 6, 8, 8, 2 };
int N = sizeof (arr) / sizeof (arr[0]);
maximumlength(arr, N);
return 0;
}
|
Java
import java.util.*;
class GFG{
public static boolean isPower( int x)
{
if (x != 0 && (x & (x - 1 )) == 0 )
return true ;
return false ;
}
public static void maximumlength( int arr[],
int N)
{
int max_length = 0 ;
int max_len_subarray = 0 ;
for ( int i = 0 ; i < N; i++)
{
if (isPower(arr[i]))
{
max_length++;
max_len_subarray = Math.max(max_length,
max_len_subarray);
}
else
{
max_length = 0 ;
}
}
System.out.println(max_len_subarray);
}
public static void main(String args[])
{
int arr[] = { 2 , 5 , 4 , 6 , 8 , 8 , 2 };
int N = arr.length;
maximumlength(arr, N);
}
}
|
Python3
def isPower(x):
if (x ! = 0 and
(x & (x - 1 )) = = 0 ):
return True ;
return False ;
def maximumlength(arr, N):
max_length = 0 ;
max_len_subarray = 0 ;
for i in range (N):
if (isPower(arr[i])):
max_length + = 1 ;
max_len_subarray = max (max_length,
max_len_subarray);
else :
max_length = 0 ;
print (max_len_subarray);
if __name__ = = '__main__' :
arr = [ 2 , 5 , 4 ,
6 , 8 , 8 , 2 ];
N = len (arr);
maximumlength(arr, N);
|
C#
using System;
class GFG{
public static bool isPower( int x)
{
if (x != 0 && (x & (x - 1)) == 0)
return true ;
return false ;
}
public static void maximumlength( int [] arr,
int N)
{
int max_length = 0;
int max_len_subarray = 0;
for ( int i = 0; i < N; i++)
{
if (isPower(arr[i]))
{
max_length++;
max_len_subarray = Math.Max(max_length,
max_len_subarray);
}
else
{
max_length = 0;
}
}
Console.WriteLine(max_len_subarray);
}
public static void Main()
{
int [] arr = { 2, 5, 4, 6, 8, 8, 2 };
int N = arr.Length;
maximumlength(arr, N);
}
}
|
Javascript
<script>
function isPower(x)
{
return (x && (!(x & (x - 1))));
}
function maximumlength(arr, N)
{
var max_length = 0;
var max_len_subarray = 0;
for ( var i = 0; i < N; i++) {
if (isPower(arr[i]) == 1) {
max_length++;
max_len_subarray
= Math.max(max_length,
max_len_subarray);
}
else {
max_length = 0;
}
}
document.write( max_len_subarray);
}
var arr = [2, 5, 4, 6, 8, 8, 2];
var N = arr.length;
maximumlength(arr, N);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)