Given an array, arr[] of size N, the task is to find the distinct absolute differences of all possible pairs of the given array.
Examples:
Input: arr[] = { 1, 3, 6 }
Output: 2 3 5
Explanation:
abs(arr[0] – arr[1]) = 2
abs(arr[1] – arr[2]) = 3
abs(arr[0] – arr[2]) = 5
Input: arr[] = { 5, 6, 7, 8, 14, 19, 21, 22 }
Output: 1 2 3 5 6 7 8 9 11 12 13 14 15 16 17
Naive Approach: The simplest approach to solve this problem is to generate all possible pairs of the given array and insert the absolute difference of each pair in a Set. Finally, print all the elements of the set.
Time Complexity: O(N2 * log(N))
Auxiliary Space: O(N2)
Approach: The above approach can be optimized using Bitset. Follow the steps below to solve the problem:
- Initialize a Bitset, say bset, where bset[i] check if i is present in the array or not.
- Traverse the array arr[] and store all the array elements in the bset.
- Initialize a Bitset, say diff, where diff[i] stores if the absolute difference of there exists any pair in the array whose value equal to i or not.
- Find the largest element of the array, say Max
- Iterate over the range [0, Max]. In every ith iteration check if bset[i] is true or not. If found to be true, then insert the absolute difference of i with all other array elements using diff = diff | (bset >> i).
- Finally, iterate over the range [0, Max] and check if diff[i] is true or not. If found to be true, then print i.
Below is the implementation of the above approach:
// C++ program for the above approach #include <bits/stdc++.h> using namespace std;
#define Max 100005 // Function to find all distinct // absolute difference of all // possible pairs of the array void printUniqDif( int n, int a[])
{ // bset[i]: Check if i is present
// in the array or not
bitset<Max> bset;
// diff[i]: Check if there exists a
// pair whose absolute difference is i
bitset<Max> diff;
// Traverse the array, arr[]
for ( int i = 0; i < n; i++) {
// Add in bitset
bset.set(a[i]);
}
// Iterate over the range[0, Max]
for ( int i = 0; i <= Max; i++) {
// If i-th bit is set
if (bset[i]) {
// Insert the absolute difference
// of all possible pairs whose
// first element is arr[i]
diff = diff | (bset >> i);
}
}
// Stores count of set bits
int X = bset.count();
// If there is at least one
// duplicate element in arr[]
if (X != n) {
cout << 0 << " " ;
}
// Printing the distinct absolute
// differences of all possible pairs
for ( int i = 1; i <= Max; i++) {
// If i-th bit is set
if (diff[i]) {
cout << i << " " ;
}
}
} // Driver Code int main()
{ // Given array
int a[] = { 1, 4, 6 };
// Given size
int n = sizeof (a) / sizeof (a[0]);
// Function Call
printUniqDif(n, a);
return 0;
} |
// Java program for the above approach import java.util.*;
class GFG
{ static int Max = 100005 ;
// Function to find all distinct
// absolute difference of all
// possible pairs of the array
static void printUniqDif( int n, int [] a)
{
// bset[i] Check if i is present
// in the array or not
int [] bset = new int [ 33 ];
// diff[i] Check if there exists a
// pair whose absolute difference is i
int diff = 0 ;
// Traverse the array, arr[]
for (var i = 0 ; i < n; i++)
bset[a[i]] = 1 ;
// Iterate over the range[0, Max]
int d = 0 ;
for (var i = 0 ; i < 33 ; i++)
d = d | (bset[i] << i);
for (var i = 0 ; i < 33 ; i++)
{
// If i-th bit is set
if (bset[i] == 1 )
// Insert the absolute difference
// of all possible pairs whose
// first element is arr[i]
diff |= (d >> i);
}
// Stores count of set bits
int X = 0 ;
for ( int i = 0 ; i < 33 ; i++)
if (bset[i] == 1 )
X++;
String Y =Integer.toBinaryString(diff);
// If there is at least one
// duplicate element in arr[]
if (X != n)
System.out.print( "0 " );
// Printing the distinct absolute
// differences of all possible pairs
for (var i = 1 ; i < Y.length(); i++)
{
// If i-th bit is set
if (Y.charAt(i) == '1' )
System.out.print(i + " " );
}
}
// Driver Code
public static void main(String[] args)
{
// Given array
int [] a = { 1 , 4 , 6 };
// Given size
int n = a.length;
// Function Call
printUniqDif(n, a);
}
} // This code is contributed by phasing17 |
# Python3 program for the above approach Max = 100005
# Function to find all distinct # absolute difference of all # possible pairs of the array def printUniqDif(n, a):
# bset[i]: Check if i is present
# in the array or not
bset = [ 0 for i in range ( 33 )]
# diff[i]: Check if there exists a
# pair whose absolute difference is i
diff = 0
# Traverse the array, arr[]
for i in range (n):
bset[a[i]] = 1
# Iterate over the range[0, Max]
d = 0
for i in range ( 1 , 33 ):
d = d | (bset[i]<<i)
for i in range ( 33 ):
# If i-th bit is set
if (bset[i]):
# Insert the absolute difference
# of all possible pairs whose
# first element is arr[i]
diff = diff | d >> i
# print(bin(diff))
# Stores count of set bits
X, Y = bset.count( 1 ), str ( bin (diff)[ 2 :])
# If there is at least one
# duplicate element in arr[]
if (X ! = n):
print ( 0 , end = " " )
# Printing the distinct absolute
# differences of all possible pairs
for i in range ( 1 , len (Y)):
# If i-th bit is set
if (Y[i] = = '1' ):
print (i, end = " " )
# Driver Code if __name__ = = '__main__' :
# Given array
a = [ 1 , 4 , 6 ]
# Given size
n = len (a)
# Function Call
printUniqDif(n, a)
# This code is contributed by mohit kumar 29
|
// C# program for the above approach using System;
using System.Linq;
using System.Collections.Generic;
class GFG
{ static int Max = 100005;
// Function to find all distinct
// absolute difference of all
// possible pairs of the array
static void printUniqDif( int n, int [] a)
{
// bset[i] Check if i is present
// in the array or not
int [] bset = new int [33];
// diff[i] Check if there exists a
// pair whose absolute difference is i
int diff = 0;
// Traverse the array, arr[]
for ( var i = 0; i < n; i++)
bset[a[i]] = 1;
// Iterate over the range[0, Max]
int d = 0;
for ( var i = 0; i < 33; i++)
d = d | (bset[i] << i);
for ( var i = 0; i < 33; i++)
{
// If i-th bit is set
if (bset[i] == 1)
// Insert the absolute difference
// of all possible pairs whose
// first element is arr[i]
diff |= (d >> i);
}
// Stores count of set bits
int X = bset.Count(f => f == 1);
string Y = Convert.ToString(diff, 2);
// If there is at least one
// duplicate element in arr[]
if (X != n)
Console.Write( "0 " );
// Printing the distinct absolute
// differences of all possible pairs
for ( var i = 1; i < Y.Length; i++)
{
// If i-th bit is set
if (Y[i] == '1' )
Console.Write(i + " " );
}
}
// Driver Code
public static void Main( string [] args)
{
// Given array
int [] a = {1, 4, 6};
// Given size
int n = a.Length;
// Function Call
printUniqDif(n, a);
}
} // This code is contributed by phasing17 |
// JS program for the above approach let Max = 100005 // Function to find all distinct // absolute difference of all // possible pairs of the array function printUniqDif(n, a)
{ // bset[i] Check if i is present
// in the array or not
let bset = new Array(33).fill(0)
// diff[i] Check if there exists a
// pair whose absolute difference is i
let diff = 0
// Traverse the array, arr[]
for ( var i = 0; i < n; i++)
bset[a[i]] = 1
// Iterate over the range[0, Max]
let d = 0
for ( var i = 0; i < 33; i++)
d = d | (bset[i] << i)
for ( var i = 0; i < 33; i++)
{
// If i-th bit is set
if (bset[i] == 1)
// Insert the absolute difference
// of all possible pairs whose
// first element is arr[i]
diff |= (d >> i)
}
// Stores count of set bits
let X = bset.filter(x => x == 1).length
let Y = diff.toString(2)
// If there is at least one
// duplicate element in arr[]
if (X != n)
process.stdout.write( "0 " )
// Printing the distinct absolute
// differences of all possible pairs
for ( var i = 1; i < Y.length; i++)
// If i-th bit is set
if (Y.charAt(i) == '1' )
process.stdout.write(i + " " )
} // Driver Code // Given array let a = [1, 4, 6] // Given size let n = a.length // Function Call printUniqDif(n, a) // This code is contributed by phasing17 |
2 3 5
Time Complexity:O(N + Max), where Max is the largest element of the array.
Auxiliary Space: O(Max)