Find N’th item in a set formed by sum of two arrays
Last Updated :
13 Sep, 2023
Given two sorted arrays, we can get a set of sums(add one element from the first and one from second). Find the N’th element in the elements of the formed set considered in sorted order.
Note: Set of sums should have unique elements.
Examples:
Input: arr1[] = {1, 2}
arr2[] = {3, 4}
N = 3
Output: 6
We get following elements set of sums.
4(1+3), 5(2+3 or 1+4), 6(2+4)
Third element in above set is 6.
Input: arr1[] = { 1,3, 4, 8, 10}
arr2[] = {20, 22, 30, 40}
N = 4
Output: 25
We get following elements set of sums.
21(1+20), 23(1+22 or 20+3), 24(20+4), 25(22+3)...
Fourth element is 25.
Asked in: Microsoft Interview
Approach:
- Run two loops – one for the first array and second for the second array.
- Just consider each pair and store their sum in a self-balancing-BST (which is implemented by set and map in C++).
- We use set in C++ here as we need to only see if elements are present or absent, we don’t need key, value pairs.
- Traverse the set and return the Nth element in the set.
Below is the implementation of the above approach:
C++
#include<bits/stdc++.h>
using namespace std;
int calculateSetOfSum( int arr1[], int size1, int arr2[],
int size2, int N)
{
set< int > s;
for ( int i=0 ; i < size1; i++)
for ( int j=0; j < size2; j++)
s.insert(arr1[i]+arr2[j]);
if (s.size() < N)
return -1;
set< int >::iterator it = s.begin();
for ( int count=1; count<N; count++)
it++;
return *it;
}
int main()
{
int arr1[] = {1, 2};
int size1 = sizeof (arr1) / sizeof (arr1[0]);
int arr2[] = {3, 4};
int size2 = sizeof (arr2) / sizeof (arr2[0]);
int N = 3;
int res = calculateSetOfSum(arr1, size1, arr2, size2, N);
if (res == -1)
cout << "N'th term doesn't exists in set" ;
else
cout << "N'th element in the set of sums is "
<< res;
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int calculateSetOfSum( int arr1[], int size1, int arr2[],
int size2, int N)
{
SortedSet<Integer> s = new TreeSet<Integer>();
for ( int i = 0 ; i < size1; i++)
for ( int j = 0 ; j < size2; j++)
s.add(arr1[i]+arr2[j]);
if (s.size() < N)
return - 1 ;
return ( int )s.toArray()[ N- 1 ];
}
public static void main(String[] args)
{
int arr1[] = { 1 , 2 };
int size1 = arr1.length;
int arr2[] = { 3 , 4 };
int size2 = arr2.length;
int N = 3 ;
int res = calculateSetOfSum(arr1, size1, arr2, size2, N);
if (res == - 1 )
System.out.println( "N'th term doesn't exists in set" );
else
System.out.println( "N'th element in the set of sums is "
+res);
}
}
|
Python3
def calculateSetOfSum(arr1, size1,arr2, size2, N):
s = set ()
for i in range (size1):
for j in range (size2):
s.add(arr1[i] + arr2[j])
if ( len (s) < N):
return - 1
return list (s)[N - 1 ]
arr1 = [ 1 , 2 ]
size1 = len (arr1)
arr2 = [ 3 , 4 ]
size2 = len (arr2)
N = 3
res = calculateSetOfSum(arr1, size1,
arr2, size2, N)
if (res = = - 1 ):
print ( "N'th term doesn't exists in set" )
else :
print (f "N'th element in the set of sums is {res}" )
|
C#
using System;
using System.Linq;
using System.Collections.Generic;
class GFG
{
static int calculateSetOfSum( int []arr1, int size1,
int []arr2, int size2,
int N)
{
HashSet< int > s = new HashSet< int >();
for ( int i = 0; i < size1; i++)
for ( int j = 0; j < size2; j++)
s.Add(arr1[i] + arr2[j]);
if (s.Count < N)
return -1;
int []last = s.ToArray();
return last[s.Count - 1];
}
public static void Main(String[] args)
{
int []arr1 = {1, 2};
int size1 = arr1.Length;
int []arr2 = {3, 4};
int size2 = arr2.Length;
int N = 3;
int res = calculateSetOfSum(arr1, size1,
arr2, size2, N);
if (res == -1)
Console.WriteLine( "N'th term doesn't exists in set" );
else
Console.WriteLine( "N'th element in the set" +
" of sums is " + res);
}
}
|
Javascript
<script>
function calculateSetOfSum(arr1, size1,
arr2, size2, N)
{
let s = new Set();
for (let i = 0; i < size1; i++)
for (let j = 0; j < size2; j++)
s.add(arr1[i]+arr2[j]);
if (s.size < N)
return -1;
return Array.from(s)[N - 1];
}
let arr1 = [ 1, 2 ];
let size1 = arr1.length;
let arr2 = [ 3, 4 ];
let size2 = arr2.length;
let N = 3;
let res = calculateSetOfSum(arr1, size1,
arr2, size2, N);
if (res == -1)
document.write( "N'th term doesn't " +
"exists in set" );
else
document.write( "N'th element in the set " +
"of sums is " + res);
</script>
|
Output
N'th element in the set of sums is 6
Time Complexity: O(mn log (mn)) where m is the size of the first array and n is the size of the second array.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...