Count distinct pairs from two arrays having same sum of digits
Last Updated :
31 Jan, 2023
Given two arrays arr1[] and arr2[]. The task is to find the total number of distinct pairs(formed by picking 1 element from arr1 and one element from arr2), such that both the elements of the pair have the sum of digits.
Note: Pairs occurring more than once must be counted only once.
Examples:
Input : arr1[] = {33, 41, 59, 1, 3}
arr2[] = {3, 32, 51, 3}
Output : 3
Possible pairs are:
(33, 51), (41, 32), (3, 3)
Input : arr1[] = {1, 6, 4, 22}
arr2[] = {1, 3, 24}
Output : 2
Possible pairs are:
(1, 1), (6, 24)
Approach:
- Run two nested loops to generate all possible pairs from the two arrays taking one element from arr1[] and one from arr2[].
- If sum of digits is equal, then insert the pair(a, b) into a set, in order to avoid duplicates where a is the smaller element and b is the larger one.
- Total pairs will be the size of the final set.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int digitSum( int n)
{
int sum = 0;
while (n > 0) {
sum += n % 10;
n = n / 10;
}
return sum;
}
int totalPairs( int arr1[], int arr2[], int n, int m)
{
set<pair< int , int > > s;
for ( int i = 0; i < n; i++) {
for ( int j = 0; j < m; j++) {
if (digitSum(arr1[i]) == digitSum(arr2[j])) {
if (arr1[i] < arr2[j])
s.insert(make_pair(arr1[i], arr2[j]));
else
s.insert(make_pair(arr2[j], arr1[i]));
}
}
}
return s.size();
}
int main()
{
int arr1[] = { 100, 3, 7, 50 };
int arr2[] = { 5, 1, 10, 4 };
int n = sizeof (arr1) / sizeof (arr1[0]);
int m = sizeof (arr2) / sizeof (arr2[0]);
cout << totalPairs(arr1, arr2, n, m);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static class pair
{
int first, second;
public pair( int first, int second)
{
this .first = first;
this .second = second;
}
}
static int digitSum( int n)
{
int sum = 0 ;
while (n > 0 )
{
sum += n % 10 ;
n = n / 10 ;
}
return sum;
}
static int totalPairs( int arr1[], int arr2[],
int n, int m)
{
Set<pair> s = new HashSet<>();
for ( int i = 0 ; i < n; i++)
{
for ( int j = 0 ; j < m; j++)
{
if (digitSum(arr1[i]) == digitSum(arr2[j]))
{
if (arr1[i] < arr2[j])
s.add( new pair(arr1[i], arr2[j]));
else
s.add( new pair(arr2[j], arr1[i]));
}
}
}
return s.size();
}
public static void main(String[] args)
{
int arr1[] = { 100 , 3 , 7 , 50 };
int arr2[] = { 5 , 1 , 10 , 4 };
int n = arr1.length;
int m = arr2.length;
System.out.println(totalPairs(arr1, arr2, n, m));
}
}
|
Python3
def digitSum(n):
Sum = 0
while n > 0 :
Sum + = n % 10
n = n / / 10
return Sum
def totalPairs(arr1, arr2, n, m):
s = set ()
for i in range ( 0 , n):
for j in range ( 0 , m):
if digitSum(arr1[i]) = = digitSum(arr2[j]):
if arr1[i] < arr2[j]:
s.add((arr1[i], arr2[j]))
else :
s.add((arr2[j], arr1[i]))
return len (s)
if __name__ = = "__main__" :
arr1 = [ 100 , 3 , 7 , 50 ]
arr2 = [ 5 , 1 , 10 , 4 ]
n = len (arr1)
m = len (arr2)
print (totalPairs(arr1, arr2, n, m))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
public class pair
{
public int first, second;
public pair( int first, int second)
{
this .first = first;
this .second = second;
}
}
static int digitSum( int n)
{
int sum = 0;
while (n > 0)
{
sum += n % 10;
n = n / 10;
}
return sum;
}
static int totalPairs( int []arr1, int []arr2,
int n, int m)
{
HashSet<pair> s = new HashSet<pair>();
for ( int i = 0; i < n; i++)
{
for ( int j = 0; j < m; j++)
{
if (digitSum(arr1[i]) == digitSum(arr2[j]))
{
if (arr1[i] < arr2[j])
s.Add( new pair(arr1[i], arr2[j]));
else
s.Add( new pair(arr2[j], arr1[i]));
}
}
}
return s.Count;
}
public static void Main(String[] args)
{
int []arr1 = { 100, 3, 7, 50 };
int []arr2 = { 5, 1, 10, 4 };
int n = arr1.Length;
int m = arr2.Length;
Console.WriteLine(totalPairs(arr1, arr2, n, m));
}
}
|
Javascript
<script>
function digitSum(n)
{
var sum = 0;
while (n > 0) {
sum += n % 10;
n = parseInt(n / 10);
}
return sum;
}
function totalPairs(arr1, arr2, n, m)
{
var s = new Set();
for ( var i = 0; i < n; i++) {
for ( var j = 0; j < m; j++) {
if (digitSum(arr1[i]) == digitSum(arr2[j])) {
if (arr1[i] < arr2[j])
s.add([arr1[i], arr2[j]]);
else
s.add([arr2[j], arr1[i]]);
}
}
}
return s.size;
}
var arr1 = [100, 3, 7, 50 ];
var arr2 = [5, 1, 10, 4 ];
var n = arr1.length;
var m = arr2.length;
document.write( totalPairs(arr1, arr2, n, m));
</script>
|
Time complexity: O(n*m), where n is the number of elements in the first input array and m is the number of elements in the second input array. This is because the code uses nested loops to iterate through both arrays and check each pair of elements. Within each iteration, the digitSum() function is called which takes constant time.
Auxiliary Space: O(n), where n is the number of unique pairs that have the same sum of digits. This is because the code uses a set to store unique pairs of elements. The set will contain at most n elements.
Share your thoughts in the comments
Please Login to comment...