Print the Longest Subarray whose Bitwise AND is maximum
Last Updated :
14 Sep, 2023
Given a positive integer array arr[] of size N, the task is to print the longest non-empty subarray whose bitwise AND is maximum in the array.
Examples:
Input: arr[ ] = {1, 5, 5, 2, 2, 2, 4, 5, 7, 7, 7, 7}
Output: 7, 7, 7, 7
Explanation: The maximum Bitwise AND is 7 and the longest subarray whose bitwise AND is 7 is from index 8 to index 11.
Input: arr[ ]={3, 2, 6, 9, 4}
Output: 9
Naive Approach
The idea is to find all subarray and in those subarrays pick those subarrays which has maximum Bitwise AND. After that return/print that subarray which has the longest length
Steps to implement-
- Declare a variable temp to store the maximum BITWISE AND.
- Declare a vector ans to store final answer
- Run two loops to find all subarrays
- Simultaneously find the length of subarray and BIWISE AND of all the values of the subarray
- If any subarray has BITWISE AND more than previously found maximum BITWISE AND, then store this subarray in the vector after removing previously stored elements
- If any subarray has BITWISE AND equal to the previously found maximum BITWISE AND, then check the length of this subarray and previously stored subarray.
- If its length is more than the previously stored subarray then store this subarray in the vector after removing previously stored elements
Code-
C++
#include <bits/stdc++.h>
using namespace std;
int longestSubarray(vector< int >& arr, int N)
{
int temp = INT_MIN;
vector< int > ans;
for ( int i = 0; i < N; i++) {
int val = INT_MIN;
int length = 0;
for ( int j = i; j < N; j++) {
length++;
if (val == INT_MIN) {
val = arr[j];
}
else {
val = val & arr[j];
}
if (val > temp) {
temp = val;
ans.clear();
for ( int k = i; k <= j; k++) {
ans.push_back(arr[k]);
}
}
else if (val == temp && length > ans.size()) {
temp = val;
ans.clear();
for ( int k = i; k <= j; k++) {
ans.push_back(arr[k]);
}
}
}
}
for ( int i = 0; i < ans.size(); i++) {
cout << ans[i] << " " ;
}
cout << endl;
}
int main()
{
vector< int > arr
= { 1, 5, 5, 2, 2, 2, 4, 5, 7, 7, 7, 7 };
int N = arr.size();
longestSubarray(arr, N);
return 0;
}
|
Java
import java.util.ArrayList;
import java.util.List;
class GFG {
public static void longestSubarray(List<Integer> arr, int N) {
int temp = Integer.MIN_VALUE;
List<Integer> ans = new ArrayList<>();
for ( int i = 0 ; i < N; i++) {
int val = Integer.MIN_VALUE;
int length = 0 ;
for ( int j = i; j < N; j++) {
length++;
if (val == Integer.MIN_VALUE) {
val = arr.get(j);
} else {
val = val & arr.get(j);
}
if (val > temp) {
temp = val;
ans.clear();
for ( int k = i; k <= j; k++) {
ans.add(arr.get(k));
}
}
else if (val == temp && length > ans.size()) {
temp = val;
ans.clear();
for ( int k = i; k <= j; k++) {
ans.add(arr.get(k));
}
}
}
}
for ( int i = 0 ; i < ans.size(); i++) {
System.out.print(ans.get(i) + " " );
}
System.out.println();
}
public static void main(String[] args) {
List<Integer> arr = new ArrayList<>();
arr.add( 1 );
arr.add( 5 );
arr.add( 5 );
arr.add( 2 );
arr.add( 2 );
arr.add( 2 );
arr.add( 4 );
arr.add( 5 );
arr.add( 7 );
arr.add( 7 );
arr.add( 7 );
arr.add( 7 );
int N = arr.size();
longestSubarray(arr, N);
}
}
|
Python3
def longestSubarray(arr, N):
temp = float ( '-inf' )
ans = []
for i in range (N):
val = float ( '-inf' )
length = 0
for j in range (i, N):
length + = 1
if val = = float ( '-inf' ):
val = arr[j]
else :
val = val & arr[j]
if val > temp:
temp = val
ans = arr[i:j + 1 ]
elif val = = temp and length > len (ans):
temp = val
ans = arr[i:j + 1 ]
for num in ans:
print (num, end = ' ' )
print ()
arr = [ 1 , 5 , 5 , 2 , 2 , 2 , 4 , 5 , 7 , 7 , 7 , 7 ]
N = len (arr)
longestSubarray(arr, N)
|
C#
using System;
using System.Collections.Generic;
class Program
{
static void Main( string [] args)
{
List< int > arr = new List< int > { 1, 5, 5, 2, 2, 2, 4, 5, 7, 7, 7, 7 };
int N = arr.Count;
LongestSubarray(arr, N);
}
static void LongestSubarray(List< int > arr, int N)
{
int temp = int .MinValue;
List< int > ans = new List< int >();
for ( int i = 0; i < N; i++)
{
int val = int .MinValue;
int length = 0;
for ( int j = i; j < N; j++)
{
length++;
if (val == int .MinValue)
{
val = arr[j];
}
else
{
val = val & arr[j];
}
if (val > temp)
{
temp = val;
ans.Clear();
for ( int k = i; k <= j; k++)
{
ans.Add(arr[k]);
}
}
else if (val == temp && length > ans.Count)
{
temp = val;
ans.Clear();
for ( int k = i; k <= j; k++)
{
ans.Add(arr[k]);
}
}
}
}
foreach ( int num in ans)
{
Console.Write(num + " " );
}
Console.WriteLine();
}
}
|
Javascript
function longestSubarray(arr) {
let temp = -Infinity;
let ans = [];
for (let i = 0; i < arr.length; i++) {
let val = -Infinity;
let length = 0;
for (let j = i; j < arr.length; j++) {
length++;
if (val === -Infinity) {
val = arr[j];
} else {
val = val & arr[j];
}
if (val > temp) {
temp = val;
ans = arr.slice(i, j + 1);
}
else if (val === temp && length > ans.length) {
temp = val;
ans = arr.slice(i, j + 1);
}
}
}
console.log(ans.join( " " ));
}
const arr = [1, 5, 5, 2, 2, 2, 4, 5, 7, 7, 7, 7];
longestSubarray(arr);
|
Output-
7 7 7 7
Time Complexity: O(N3), because of two nested loops to find all subarray and a third loop to insert required subarray into vector
Auxiliary Space: O(N), for storing answer
Approach: The approach for code will be:
It is always better to take the maximum element and find the longest continous subarray having only the maximum element of the array.
Steps involved in the implementation of the code:
- Find the maximum value in the array using a loop and keep it in the variable maxi_val.
- Initialize two variables count and maxi to 1. count will keep track of the length of the current subarray with the maximum element repeated, and maxi will keep track of the maximum length seen so far.
- Traverse the array using a loop, and find the length of length occurring the same element.
Below is the implementation for the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int longestSubarray(vector< int >& nums)
{
int maxi_val = 0;
for ( int i = 0; i < nums.size(); i++)
maxi_val = max(maxi_val, nums[i]);
int count = 1, maxi = 1;
for ( int i = 0; i < nums.size() - 1; i++) {
if (nums[i] == maxi_val && nums[i] == nums[i + 1])
count++;
else
count = 1;
maxi = max(maxi, count);
}
int i = 0;
while (i < maxi) {
cout << maxi_val << " " ;
i++;
}
}
int main()
{
vector< int > arr
= { 1, 5, 5, 2, 2, 2, 4, 5, 7, 7, 7, 7 };
int N = sizeof (arr) / sizeof (arr[0]);
longestSubarray(arr);
return 0;
}
|
Java
import java.util.*;
public class GFG {
public static void longestSubarray(List<Integer> nums) {
int maxi_val = 0 ;
for ( int i = 0 ; i < nums.size(); i++) {
maxi_val = Math.max(maxi_val, nums.get(i));
}
int count = 1 , maxi = 1 ;
for ( int i = 0 ; i < nums.size() - 1 ; i++) {
if (nums.get(i) == maxi_val && nums.get(i) == nums.get(i + 1 )) {
count++;
} else {
count = 1 ;
}
maxi = Math.max(maxi, count);
}
int i = 0 ;
while (i < maxi) {
System.out.print(maxi_val + " " );
i++;
}
}
public static void main(String[] args) {
List<Integer> arr = new ArrayList<>(Arrays.asList( 1 , 5 , 5 , 2 , 2 , 2 , 4 , 5 , 7 , 7 , 7 , 7 ));
longestSubarray(arr);
}
}
|
Python3
def longestSubarray(nums):
maxi_val = 0
for i in range ( len (nums)):
maxi_val = max (maxi_val, nums[i])
count = 1
maxi = 1
for i in range ( len (nums) - 1 ):
if nums[i] = = maxi_val and nums[i] = = nums[i + 1 ]:
count + = 1
else :
count = 1
maxi = max (maxi, count)
i = 0
while i < maxi:
print (maxi_val, end = " " )
i + = 1
arr = [ 1 , 5 , 5 , 2 , 2 , 2 , 4 , 5 , 7 , 7 , 7 , 7 ]
longestSubarray(arr)
|
C#
using System;
public class GFG {
static void longestSubarray( int [] nums)
{
int maxi_val = 0;
for ( int i = 0; i < nums.Length; i++)
maxi_val = Math.Max(maxi_val, nums[i]);
int count = 1, maxi = 1;
for ( int i = 0; i < nums.Length - 1; i++) {
if (nums[i] == maxi_val
&& nums[i] == nums[i + 1])
count++;
else
count = 1;
maxi = Math.Max(maxi, count);
}
int k = 0;
while (k < maxi) {
Console.Write(maxi_val + " " );
k++;
}
}
static public void Main()
{
int [] arr = { 1, 5, 5, 2, 2, 2, 4, 5, 7, 7, 7, 7 };
int N = arr.Length;
longestSubarray(arr);
}
}
|
Javascript
function longestSubarray(nums) {
let maxi_val = 0;
for (let i = 0; i < nums.length; i++)
maxi_val = Math.max(maxi_val, nums[i]);
let count = 1, maxi = 1;
for (let i = 0; i < nums.length - 1; i++) {
if (nums[i] == maxi_val && nums[i] == nums[i + 1])
count++;
else
count = 1;
maxi = Math.max(maxi, count);
}
let i = 0;
while (i < maxi) {
console.log(maxi_val + " " );
i++;
}
return maxi;
}
let arr = [1, 5, 5, 2, 2, 2, 4, 5, 7, 7, 7, 7];
let result = longestSubarray(arr);
console.log( "Length of longest subarray with maximum element repeated is: " + result);
|
Time Complexity: O(n)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...