Given three integer arrays and a “sum”, the task is to check if there are three elements a, b, c such that a + b + c = sum and a, b and c belong to three different arrays.
Examples :
Input : a1[] = { 1 , 2 , 3 , 4 , 5 };
a2[] = { 2 , 3 , 6 , 1 , 2 };
a3[] = { 3 , 2 , 4 , 5 , 6 };
sum = 9
Output : Yes
1 + 2 + 6 = 9 here 1 from a1[] and 2 from
a2[] and 6 from a3[]
Input : a1[] = { 1 , 2 , 3 , 4 , 5 };
a2[] = { 2 , 3 , 6 , 1 , 2 };
a3[] = { 3 , 2 , 4 , 5 , 6 };
sum = 20
Output : No
A naive approach is to run three loops and check sum of three element form different arrays equal to given number if find then print exist and otherwise print not exist.
Algorithm:
- Define a function findTriplet that takes in three integer arrays a1, a2, a3, their respective sizes n1, n2, n3, and the integer variable sum.
- Loop through each element of a1, a2, and a3 using three nested for-loops.
- If the sum of the current triplet of elements (a1[i], a2[j], a3[k]) is equal to sum, return true.
- If no such triplet is found, return false.
- In the main function, define three integer arrays a1, a2, a3, and the integer variable sum.
- Get the size of each array using sizeof operator and divide it by the size of a single element to get the size of the array in terms of number of elements.
- Call the findTriplet function with a1, a2, a3, n1, n2, n3, and sum as arguments.
- If the function returns true, print “Yes“. Otherwise, print “No“.
Implementation:
C++
#include<bits/stdc++.h>
using namespace std;
bool findTriplet( int a1[], int a2[],
int a3[], int n1,
int n2, int n3, int sum)
{
for ( int i = 0; i < n1; i++)
for ( int j = 0; j < n2; j++)
for ( int k = 0; k < n3; k++)
if (a1[i] + a2[j] + a3[k] == sum)
return true ;
return false ;
}
int main()
{
int a1[] = { 1 , 2 , 3 , 4 , 5 };
int a2[] = { 2 , 3 , 6 , 1 , 2 };
int a3[] = { 3 , 2 , 4 , 5 , 6 };
int sum = 9;
int n1 = sizeof (a1) / sizeof (a1[0]);
int n2 = sizeof (a2) / sizeof (a2[0]);
int n3 = sizeof (a3) / sizeof (a3[0]);
findTriplet(a1, a2, a3, n1, n2, n3, sum)?
cout << "Yes" : cout << "No" ;
return 0;
}
|
Java
class GFG
{
static boolean findTriplet( int a1[], int a2[],
int a3[], int n1,
int n2, int n3, int sum)
{
for ( int i = 0 ; i < n1; i++)
for ( int j = 0 ; j < n2; j++)
for ( int k = 0 ; k < n3; k++)
if (a1[i] + a2[j] + a3[k] == sum)
return true ;
return false ;
}
public static void main (String[] args)
{
int a1[] = { 1 , 2 , 3 , 4 , 5 };
int a2[] = { 2 , 3 , 6 , 1 , 2 };
int a3[] = { 3 , 2 , 4 , 5 , 6 };
int sum = 9 ;
int n1 = a1.length;
int n2 = a2.length;
int n3 = a3.length;
if (findTriplet(a1, a2, a3, n1, n2, n3, sum))
System.out.print( "Yes" );
else
System.out.print( "No" );
}
}
|
Python3
def findTriplet(a1, a2, a3,
n1, n2, n3, sum ):
for i in range ( 0 , n1):
for j in range ( 0 , n2):
for k in range ( 0 , n3):
if (a1[i] + a2[j] +
a3[k] = = sum ):
return True
return False
a1 = [ 1 , 2 , 3 , 4 , 5 ]
a2 = [ 2 , 3 , 6 , 1 , 2 ]
a3 = [ 3 , 2 , 4 , 5 , 6 ]
sum = 9
n1 = len (a1)
n2 = len (a2)
n3 = len (a3)
print ( "Yes" ) if findTriplet(a1, a2, a3,
n1, n2, n3,
sum ) else print ( "No" )
|
C#
using System;
public class GFG
{
static bool findTriplet( int []a1, int []a2,
int []a3, int n1,
int n2, int n3,
int sum)
{
for ( int i = 0; i < n1; i++)
for ( int j = 0; j < n2; j++)
for ( int k = 0; k < n3; k++)
if (a1[i] + a2[j] + a3[k] == sum)
return true ;
return false ;
}
static public void Main ()
{
int []a1 = {1 , 2 , 3 , 4 , 5};
int []a2 = {2 , 3 , 6 , 1 , 2};
int []a3 = {3 , 2 , 4 , 5 , 6};
int sum = 9;
int n1 = a1.Length;
int n2 = a2.Length;
int n3 = a3.Length;
if (findTriplet(a1, a2, a3, n1,
n2, n3, sum))
Console.WriteLine( "Yes" );
else
Console.WriteLine( "No" );
}
}
|
PHP
<?php
function findTriplet( $a1 , $a2 , $a3 ,
$n1 , $n2 , $n3 ,
$sum )
{
for ( $i = 0; $i < $n1 ; $i ++)
for ( $j = 0; $j < $n2 ; $j ++)
for ( $k = 0; $k < $n3 ; $k ++)
if ( $a1 [ $i ] + $a2 [ $j ] + $a3 [ $k ] == $sum )
return true;
return false;
}
$a1 = array ( 1 , 2 , 3 , 4 , 5 );
$a2 = array ( 2 , 3 , 6 , 1 , 2 );
$a3 = array ( 3 , 2 , 4 , 5 , 6 );
$sum = 9;
$n1 = count ( $a1 );
$n2 = count ( $a2 );
$n3 = count ( $a3 );
if (findTriplet( $a1 , $a2 , $a3 , $n1 ,
$n2 , $n3 , $sum )==true)
echo "Yes" ;
else
echo "No" ;
?>
|
Javascript
<script>
function findTriplet(a1, a2, a3, n1,
n2, n3, sum)
{
for ( var i = 0; i < n1; i++)
for ( var j = 0; j < n2; j++)
for ( var k = 0; k < n3; k++)
if (a1[i] + a2[j] + a3[k] == sum)
return true ;
return false ;
}
var a1 = [ 1 , 2 , 3 , 4 , 5 ];
var a2 = [ 2 , 3 , 6 , 1 , 2 ];
var a3 = [ 3 , 2 , 4 , 5 , 6 ];
var sum = 9;
var n1 = a1.length;
var n2 = a2.length;
var n3 = a3.length;
findTriplet(a1, a2, a3, n1, n2, n3, sum)?
document.write( "Yes" ) : document.write( "No" );
</script>
|
Time Complexity : O(n3)
Auxiliary Space: O(1)
An efficient solution is to store all elements of first array in hash table (unordered_set in C++) and calculate sum of two elements last two array elements one by one and subtract from given number k and check in hash table if it exists in the hash table then print exist and otherwise not exist.
1. Store all elements of first array in hash table
2. Generate all pairs of elements from two arrays using
nested loop. For every pair (a1[i], a2[j]), check if
sum - (a1[i] + a2[j]) exists in hash table. If yes
return true.
Below is the implementation of above idea.
C++
#include<bits/stdc++.h>
using namespace std;
bool findTriplet( int a1[], int a2[],
int a3[], int n1,
int n2, int n3,
int sum)
{
unordered_set < int > s;
for ( int i = 0; i < n1; i++)
s.insert(a1[i]);
for ( int i = 0; i < n2; i++)
{
for ( int j = 0; j < n3; j++)
{
if (s.find(sum - a2[i] - a3[j]) !=
s.end())
return true ;
}
}
return false ;
}
int main()
{
int a1[] = { 1 , 2 , 3 , 4 , 5 };
int a2[] = { 2 , 3 , 6 , 1 , 2 };
int a3[] = { 3 , 2 , 4 , 5 , 6 };
int sum = 9;
int n1 = sizeof (a1) / sizeof (a1[0]);
int n2 = sizeof (a2) / sizeof (a2[0]);
int n3 = sizeof (a3) / sizeof (a3[0]);
findTriplet(a1, a2, a3, n1, n2, n3, sum)?
cout << "Yes" : cout << "No" ;
return 0;
}
|
Java
import java.util.*;
class GFG
{
static boolean findTriplet( int a1[], int a2[], int a3[],
int n1, int n2, int n3,
int sum)
{
HashSet<Integer> s = new HashSet<Integer>();
for ( int i = 0 ; i < n1; i++)
{
s.add(a1[i]);
}
ArrayList<Integer> al = new ArrayList<>(s);
for ( int i = 0 ; i < n2; i++)
{
for ( int j = 0 ; j < n3; j++)
{
if (al.contains(sum - a2[i] - a3[j]) &
al.indexOf(sum - a2[i] - a3[j])
!= al.get(al.size() - 1 ))
{
return true ;
}
}
}
return false ;
}
public static void main(String[] args)
{
int a1[] = { 1 , 2 , 3 , 4 , 5 };
int a2[] = { 2 , 3 , 6 , 1 , 2 };
int a3[] = { 3 , 2 , 4 , 5 , 6 };
int sum = 9 ;
int n1 = a1.length;
int n2 = a2.length;
int n3 = a3.length;
if (findTriplet(a1, a2, a3, n1, n2, n3, sum))
{
System.out.println( "Yes" );
}
else
{
System.out.println( "No" );
}
}
}
|
Python3
def findTriplet(a1, a2, a3,
n1, n2, n3, sum ):
s = set ()
for i in range (n1):
s.add(a1[i])
for i in range (n2):
for j in range (n3):
if sum - a2[i] - a3[j] in s:
return True
return False
a1 = [ 1 , 2 , 3 , 4 , 5 ]
a2 = [ 2 , 3 , 6 , 1 , 2 ]
a3 = [ 3 , 24 , 5 , 6 ]
n1 = len (a1)
n2 = len (a2)
n3 = len (a3)
sum = 9
if findTriplet(a1, a2, a3,
n1, n2, n3, sum ) = = True :
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static bool findTriplet( int []a1, int []a2, int []a3,
int n1, int n2, int n3,
int sum)
{
HashSet< int > s = new HashSet< int >();
for ( int i = 0; i < n1; i++)
{
s.Add(a1[i]);
}
List< int > al = new List< int >(s);
for ( int i = 0; i < n2; i++)
{
for ( int j = 0; j < n3; j++)
{
if (al.Contains(sum - a2[i] - a3[j]) &
al.IndexOf(sum - a2[i] - a3[j])
!= al[al.Count - 1])
{
return true ;
}
}
}
return false ;
}
public static void Main(String[] args)
{
int []a1 = {1, 2, 3, 4, 5};
int []a2 = {2, 3, 6, 1, 2};
int []a3 = {3, 2, 4, 5, 6};
int sum = 9;
int n1 = a1.Length;
int n2 = a2.Length;
int n3 = a3.Length;
if (findTriplet(a1, a2, a3, n1, n2, n3, sum))
{
Console.WriteLine( "Yes" );
}
else
{
Console.WriteLine( "No" );
}
}
}
|
Javascript
<script>
function findTriplet(a1, a2, a3, n1, n2, n3, sum)
{
var s = new Set();
for ( var i = 0; i < n1; i++)
s.add(a1[i]);
for ( var i = 0; i < n2; i++)
{
for ( var j = 0; j < n3; j++)
{
if (s.has(sum - a2[i] - a3[j]))
return true ;
}
}
return false ;
}
var a1 = [1 , 2 , 3 , 4 , 5];
var a2 = [2 , 3 , 6 , 1 , 2];
var a3 = [3 , 2 , 4 , 5 , 6];
var sum = 9;
var n1 = a1.length;
var n2 = a2.length;
var n3 = a3.length;
findTriplet(a1, a2, a3, n1, n2, n3, sum)?
document.write( "Yes" ): document.write( "No" );
</script>
|
Time Complexity: O(n2)
Auxiliary Space: O(n)
Another efficient approach ( Space optimization ) : we will run two loops, then we will search for required sum in third loop using binary search .
Below is the implementation of the above approach :
C++
#include <bits/stdc++.h>
using namespace std;
bool binarysearch( int arr[], int N, int x)
{
int l = 0, r = N - 1;
while (l <= r) {
int mid = (l + r) / 2;
if (arr[mid] == x) {
return true ;
}
else if (arr[mid] < x) {
l = mid + 1;
}
else {
r = mid - 1;
}
}
return false ;
}
bool findTriplet( int a1[], int a2[], int a3[], int n1, int n2, int n3, int sum)
{ sort(a3,a3+n3);
for ( int i = 0; i < n1; i++)
{
for ( int j = 0; j < n2; j++)
{ int requiredsum= sum-a1[i]-a2[j];
if (binarysearch(a3, n3,requiredsum))
{
return true ;;
}
}
}
return false ;
}
int main()
{
int a1[] = { 1 , 2 , 3 , 4 , 5 };
int a2[] = { 2 , 3 , 6 , 1 , 2 };
int a3[] = { 3 , 2 , 4 , 5 , 6 };
int sum=9;
int n1 = sizeof (a1) / sizeof ( int );
int n2 = sizeof (a2) / sizeof ( int );
int n3 = sizeof (a3) / sizeof ( int );
if (findTriplet(a1, a2, a3, n1, n2, n3,sum))
{
cout<< "YES" <<endl;
}
else {
cout<< "NO" <<endl;
}
return 0;
}
|
Java
import java.util.Arrays;
class Main {
static boolean binarysearch( int arr[], int N, int x)
{
int l = 0 , r = N - 1 ;
while (l <= r) {
int mid = (l + r) / 2 ;
if (arr[mid] == x) {
return true ;
}
else if (arr[mid] < x) {
l = mid + 1 ;
}
else {
r = mid - 1 ;
}
}
return false ;
}
static boolean findTriplet( int a1[], int a2[], int a3[],
int n1, int n2, int n3,
int sum)
{
Arrays.sort(
a3);
for ( int i = 0 ; i < n1; i++) {
for ( int j = 0 ; j < n2; j++) {
int requiredsum = sum - a1[i] - a2[j];
if (binarysearch(a3, n3, requiredsum)) {
return true ;
}
}
}
return false ;
}
public static void main(String[] args)
{
int a1[] = { 1 , 2 , 3 , 4 , 5 };
int a2[] = { 2 , 3 , 6 , 1 , 2 };
int a3[] = { 3 , 2 , 4 , 5 , 6 };
int sum = 9 ;
int n1 = a1.length;
int n2 = a2.length;
int n3 = a3.length;
if (findTriplet(a1, a2, a3, n1, n2, n3, sum)) {
System.out.println(
"YES" );
}
else {
System.out.println( "NO" );
}
}
}
|
Python3
def binarysearch(arr, N, x):
l = 0
r = N - 1
while l < = r:
mid = (l + r) / / 2
if arr[mid] = = x:
return True
elif arr[mid] < x:
l = mid + 1
else :
r = mid - 1
return False
def findTriplet(a1, a2, a3, n1, n2, n3, sum ):
a3.sort()
for i in range (n1):
for j in range (n2):
requiredsum = sum - a1[i] - a2[j]
if binarysearch(a3, n3, requiredsum):
return True
return False
if __name__ = = '__main__' :
a1 = [ 1 , 2 , 3 , 4 , 5 ]
a2 = [ 2 , 3 , 6 , 1 , 2 ]
a3 = [ 3 , 2 , 4 , 5 , 6 ]
sum = 9
n1 = len (a1)
n2 = len (a2)
n3 = len (a3)
if findTriplet(a1, a2, a3, n1, n2, n3, sum ):
print ( "YES" )
else :
print ( "NO" )
|
C#
using System;
using System.Linq;
class Program {
static bool BinarySearch( int [] arr, int n, int x) {
int l = 0, r = n - 1;
while (l <= r) {
int mid = (l + r) / 2;
if (arr[mid] == x) {
return true ;
}
else if (arr[mid] < x) {
l = mid + 1;
}
else {
r = mid - 1;
}
}
return false ;
}
static bool FindTriplet( int [] a1, int [] a2, int [] a3, int n1, int n2, int n3, int sum) {
Array.Sort(a3);
for ( int i = 0; i < n1; i++) {
for ( int j = 0; j < n2; j++) {
int requiredSum = sum - a1[i] - a2[j];
if (BinarySearch(a3, n3, requiredSum)) {
return true ;
}
}
}
return false ;
}
static void Main( string [] args) {
int [] a1 = { 1, 2, 3, 4, 5 };
int [] a2 = { 2, 3, 6, 1, 2 };
int [] a3 = { 3, 2, 4, 5, 6 };
int sum = 9;
int n1 = a1.Length;
int n2 = a2.Length;
int n3 = a3.Length;
if (FindTriplet(a1, a2, a3, n1, n2, n3, sum)) {
Console.WriteLine( "YES" );
}
else {
Console.WriteLine( "NO" );
}
}
}
|
Javascript
function binarysearch(arr, N, x) {
let l = 0;
let r = N - 1;
while (l <= r) {
let mid = Math.floor((l + r) / 2);
if (arr[mid] === x) {
return true ;
} else if (arr[mid] < x) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return false ;
}
function findTriplet(a1, a2, a3, n1, n2, n3, sum) {
a3.sort();
for (let i = 0; i < n1; i++) {
for (let j = 0; j < n2; j++) {
let requiredsum = sum - a1[i] - a2[j];
if (binarysearch(a3, n3, requiredsum)) {
return true ;
}
}
}
return false ;
}
const a1 = [1, 2, 3, 4, 5];
const a2 = [2, 3, 6, 1, 2];
const a3 = [3, 2, 4, 5, 6];
const sum = 9;
const n1 = a1.length;
const n2 = a2.length;
const n3 = a3.length;
if (findTriplet(a1, a2, a3, n1, n2, n3, sum)) {
console.log( "YES" );
} else {
console.log( "NO" );
}
|
Time Complexity: O(n1*n2*log n3)
Auxiliary Space: O(1)
If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
21 Mar, 2023
Like Article
Save Article