Highest powers of 2 not exceeding non-repeating array elements
Last Updated :
14 Feb, 2023
Given an array arr[] of size N, the task is for every non-repeating array element is to find the highest power of 2 that does not exceed that element. Print the powers of 2 in ascending order. If the array does not contain any non-repeating element, print “0”.
Examples:
Input: arr[ ] = { 4, 5, 4, 3, 3, 4 }
Output: 4
Explanation: The only non-repeating element in the array is 5. Therefore, the highest power of 2 not exceeding 5 is 4.
Input: arr[ ] = { 1, 1, 7, 6, 3 }
Output: 2 4 4
Naive Approach: The simplest approach to solve this problem is to traverse the array and for each array element, check if it is non-repeating or not. For elements founds to be non-repeating, add them into another array. Then, for each element in the new array, find the highest powers of 2 not exceeding that element and print them in ascending order.
Follow the steps below to implement the above idea:
C++
#include <bits/stdc++.h>
using namespace std;
void uniqueElement( int arr[], int N)
{
vector< int > newArr;
for ( int i = 0; i < N; i++) {
bool flag = true ;
for ( int j = 0; j < N; j++) {
if (i == j)
continue ;
if (arr[i] == arr[j]) {
flag = false ;
break ;
}
}
if (flag)
newArr.push_back(arr[i]);
}
vector< int > result;
for ( auto val : newArr) {
int t = log2(val);
result.push_back( pow (2, t));
}
if (result.size() == 0) {
cout << 0 << endl;
return ;
}
sort(result.begin(), result.end());
for ( auto val : result) {
cout << val << " " ;
}
}
int main()
{
int arr[] = { 1, 1, 7, 6, 3 };
int N = sizeof (arr) / sizeof (arr[0]);
uniqueElement(arr, N);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
public class Gfg {
static void uniqueElement( int arr[], int N)
{
List<Integer> newArr = new ArrayList<>();
for ( int i = 0 ; i < N; i++) {
boolean flag = true ;
for ( int j = 0 ; j < N; j++) {
if (i == j)
continue ;
if (arr[i] == arr[j]) {
flag = false ;
break ;
}
}
if (flag)
newArr.add(arr[i]);
}
List<Integer> result = new ArrayList<>();
for ( int val : newArr) {
int t = ( int )(Math.log(val) / Math.log( 2 ));
result.add(( int )Math.pow( 2 , t));
}
if (result.size() == 0 ) {
System.out.println( 0 );
return ;
}
Collections.sort(result);
for ( int val : result) {
System.out.print(val + " " );
}
}
public static void main(String[] args)
{
int arr[] = { 1 , 1 , 7 , 6 , 3 };
int N = arr.length;
uniqueElement(arr, N);
}
}
|
Python3
import math
def uniqueElement(arr, N):
newAr = [];
for i in range ( 0 ,N):
flag = True ;
for j in range ( 0 ,N):
if (i = = j):
continue ;
if (arr[i] = = arr[j]):
flag = False ;
break ;
if (flag):
newAr.append(arr[i]);
result = [];
for i in range ( 0 , len (newAr)) :
val = newAr[i];
t = int (math.log2(val));
result.append( int ( pow ( 2 , t)));
if ( len (result) = = 0 ) :
print ( 0 );
return ;
result.sort();
for i in range ( 0 , len (result)):
print (result[i], end = " " );
arr = [ 1 , 1 , 7 , 6 , 3 ];
N = len (arr);
uniqueElement(arr, N);
|
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
public class Gfg
{
static void uniqueElement( int [] arr, int N)
{
List< int > newArr = new List< int >();
for ( int i = 0; i < N; i++) {
int flag = 1;
for ( int j = 0; j < N; j++) {
if (i == j)
continue ;
if (arr[i] == arr[j]) {
flag = 0;
break ;
}
}
if (flag == 1)
newArr.Add(arr[i]);
}
List< int > result = new List< int >();
for ( int i = 0; i < newArr.Count; i++) {
int val = newArr[i];
int t = ( int )(Math.Log(val,2));
result.Add(( int )Math.Pow(2, t));
}
if (result.Count == 0) {
Console.Write(0);
return ;
}
result.Sort();
for ( int i = 0; i < result.Count; i++) {
Console.Write(result[i]+ " " );
}
}
public static void Main( string [] args)
{
int [] arr = { 1, 1, 7, 6, 3 };
int N = arr.Length;
uniqueElement(arr, N);
}
}
|
Javascript
function uniqueElement(arr, N)
{
let newArr=[];
for (let i = 0; i < N; i++) {
let flag = true ;
for (let j = 0; j < N; j++) {
if (i == j)
continue ;
if (arr[i] == arr[j]) {
flag = false ;
break ;
}
}
if (flag)
newArr.push(arr[i]);
}
let result=[];
for (let i=0; i< newArr.length; i++) {
let t = Math.floor(Math.log2(newArr[i]));
result.push(Math.pow(2, t));
}
if (result.length == 0) {
document.write(0);
return ;
}
result.sort();
for (let i=0; i<result.length; i++) {
document.write(result[i] + " " );
}
}
let arr = [1, 1, 7, 6, 3 ];
let N = arr.length;
uniqueElement(arr , N);
|
Time Complexity: O(N2 * log arr[i]), where arr[i] is the largest number of the array.
Auxiliary Space: O(N)
Efficient Approach: The optimal idea is to use Hashing. Follow the steps below to solve the problem:
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void uniqueElement( int arr[], int N)
{
unordered_map< int , int > freq;
for ( int i = 0; i < N; i++) {
freq[arr[i]]++;
}
vector< int > v;
for ( auto i : freq) {
if (i.second == 1) {
int lg = log2(i.first);
int p = pow (2, lg);
v.push_back(p);
}
}
if (v.size() == 0) {
cout << "0" ;
return ;
}
sort(v.begin(), v.end());
for ( auto i : v)
cout << i << " " ;
}
int main()
{
int arr[] = { 4, 5, 4, 3, 3, 4 };
int N = sizeof (arr) / sizeof (arr[0]);
uniqueElement(arr, N);
return 0;
}
|
Java
import java.util.*;
class GFG{
static void uniqueElement( int arr[], int N)
{
HashMap<Integer, Integer> freq
= new HashMap<Integer, Integer>();
for ( int i = 0 ; i < N; i++)
{
if (freq.containsKey(arr[i]))
{
freq.put(arr[i], freq.get(arr[i]) + 1 );
}
else
{
freq.put(arr[i], 1 );
}
}
ArrayList<Integer> v
= new ArrayList<Integer>();
for (Map.Entry i : freq.entrySet()) {
if (( int )i.getValue() == 1 ) {
int lg = ( int )(Math.log(( int )i.getKey()) / Math.log( 2 ));
int p = ( int )Math.pow( 2 , lg);
v.add(p);
}
}
if (v.size() == 0 ) {
System.out.print( "0" );
return ;
}
Collections.sort(v);
for ( int i : v)
System.out.print( i + " " );
}
public static void main(String[] args)
{
int arr[] = { 4 , 5 , 4 , 3 , 3 , 4 };
int N = arr.length;
uniqueElement(arr, N);
}
}
|
Python3
import math
def uniqueElement(arr, N):
freq = {}
for i in range (N) :
if arr[i] in freq :
freq[arr[i]] + = 1 ;
else :
freq[arr[i]] = 1 ;
v = []
for i in freq :
if (freq[i] = = 1 ) :
lg = int (math.log2(i))
p = pow ( 2 , lg)
v.append(p)
if ( len (v) = = 0 ) :
print ( "0" )
return
v.sort()
for i in v :
print (i, end = " " )
arr = [ 4 , 5 , 4 , 3 , 3 , 4 ]
N = len (arr)
uniqueElement(arr, N)
|
C#
using System;
using System.Collections.Generic;
public class GFG{
static void uniqueElement( int []arr, int N)
{
Dictionary< int , int > freq
= new Dictionary< int , int >();
for ( int i = 0; i < N; i++)
{
if (freq.ContainsKey(arr[i]))
{
freq[arr[i]] = freq[arr[i]] + 1;
}
else
{
freq.Add(arr[i], 1);
}
}
List< int > v
= new List< int >();
foreach (KeyValuePair< int , int > i in freq) {
if (( int )i.Value == 1) {
int lg = ( int )(Math.Log(( int )i.Key) / Math.Log(2));
int p = ( int )Math.Pow(2, lg);
v.Add(p);
}
}
if (v.Count == 0) {
Console.Write( "0" );
return ;
}
v.Sort();
foreach ( int i in v)
Console.Write( i + " " );
}
public static void Main(String[] args)
{
int []arr = { 4, 5, 4, 3, 3, 4 };
int N = arr.Length;
uniqueElement(arr, N);
}
}
|
Javascript
<script>
function uniqueElement(arr, N)
{
var freq = new Map();
for ( var i = 0; i < N; i++) {
if (freq.has(arr[i]))
{
freq.set(arr[i], freq.get(arr[i])+1);
}
else
{
freq.set(arr[i], 1);
}
}
var v = [];
freq.forEach((value, key) => {
if (value== 1) {
var lg = parseInt(Math.log2(key));
var p = Math.pow(2, lg);
v.push(p);
}
});
if (v.length == 0) {
document.write( "0" );
return ;
}
v.sort((a,b) => a-b)
for ( var i =0; i<v.length; i++)
{
document.write(v[i] + " " );
}
}
var arr = [4, 5, 4, 3, 3, 4 ];
var N = arr.length;
uniqueElement(arr, N);
</script>
|
Time Complexity: O(N * log(MAXM)), where MAXM is the largest element present the array.
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...