Find largest d in array such that a + b + c = d
Last Updated :
07 Mar, 2023
Given a set S (all distinct elements) of integers, find the largest d such that a + b + c = d
where a, b, c, and d are distinct elements of S.
Constraints:
1 ? number of elements in the set ? 1000
INT_MIN ? each element in the set ? INT_MAX
Examples :
Input : S[] = {2, 3, 5, 7, 12}
Output : 12
Explanation: 12 is the largest d which can be represented as 12 = 2 + 3 + 7
Input : S[] = {2, 16, 64, 256, 1024}
Output : No solution
Method 1(Brute Force): We can solve this problem using simple brute force approach which is not very efficient as |S| can be as large as 1000. We’ll sort the set of elements and start by finding the largest d by equating it with the sum of all possible combinations of a, b and c.
Steps to solve the problem:
- Sort the input array S in ascending order.
- Iterate the input array S in reverse order. For each S[i]:
- Iterate over all unique combinations of three elements j, k, l from the remaining elements in S, such that j < k < l and i != j != k !=
- if S[j] + S[k] + S[l] == S[i], return S[i] as the largest possible value for d.
- If no such combination is found, return INT_MIN.
Below is the implementation of above idea :
C++
#include <bits/stdc++.h>
using namespace std;
int findLargestd( int S[], int n)
{
bool found = false ;
sort(S, S + n);
for ( int i = n - 1; i >= 0; i--)
{
for ( int j = 0; j < n; j++)
{
if (i == j)
continue ;
for ( int k = j + 1; k < n; k++)
{
if (i == k)
continue ;
for ( int l = k + 1; l < n; l++)
{
if (i == l)
continue ;
if (S[i] == S[j] + S[k] + S[l])
{
found = true ;
return S[i];
}
}
}
}
}
if (found == false )
return INT_MIN;
}
int main()
{
int S[] = { 2, 3, 5, 7, 12 };
int n = sizeof (S) / sizeof (S[0]);
int ans = findLargestd(S, n);
if (ans == INT_MIN)
cout << "No Solution" << endl;
else
cout << "Largest d such that a + b + "
<< "c = d is " << ans << endl;
return 0;
}
|
Java
import java.io.*;
import java.util.Arrays;
class GFG
{
static int findLargestd( int []S, int n)
{
boolean found = false ;
Arrays.sort(S);
for ( int i = n - 1 ; i >= 0 ; i--)
{
for ( int j = 0 ; j < n; j++)
{
if (i == j)
continue ;
for ( int k = j + 1 ; k < n; k++)
{
if (i == k)
continue ;
for ( int l = k + 1 ; l < n; l++)
{
if (i == l)
continue ;
if (S[i] == S[j] + S[k] + S[l])
{
found = true ;
return S[i];
}
}
}
}
}
if (found == false )
return Integer.MAX_VALUE;
return - 1 ;
}
public static void main(String []args)
{
int []S = new int []{ 2 , 3 , 5 , 7 , 12 };
int n = S.length;
int ans = findLargestd(S, n);
if (ans == Integer.MAX_VALUE)
System.out.println( "No Solution" );
else
System.out.println( "Largest d such that " +
"a + " + "b + c = d is " +
ans );
}
}
|
Python3
def findLargestd(S, n) :
found = False
S.sort()
for i in range (n - 1 , - 1 , - 1 ) :
for j in range ( 0 , n) :
if (i = = j) :
continue
for k in range (j + 1 , n) :
if (i = = k) :
continue
for l in range (k + 1 , n) :
if (i = = l) :
continue
if (S[i] = = S[j] + S[k] + S[l]) :
found = True
return S[i]
if (found = = False ) :
return - 1
S = [ 2 , 3 , 5 , 7 , 12 ]
n = len (S)
ans = findLargestd(S, n)
if (ans = = - 1 ) :
print ( "No Solution" )
else :
print ( "Largest d such that a + b +" ,
"c = d is" ,ans)
|
C#
using System;
class GFG
{
static int findLargestd( int []S,
int n)
{
bool found = false ;
Array.Sort(S);
for ( int i = n - 1; i >= 0; i--)
{
for ( int j = 0; j < n; j++)
{
if (i == j)
continue ;
for ( int k = j + 1; k < n; k++)
{
if (i == k)
continue ;
for ( int l = k + 1; l < n; l++)
{
if (i == l)
continue ;
if (S[i] == S[j] + S[k] + S[l])
{
found = true ;
return S[i];
}
}
}
}
}
if (found == false )
return int .MaxValue;
return -1;
}
public static void Main()
{
int []S = new int []{ 2, 3, 5, 7, 12 };
int n = S.Length;
int ans = findLargestd(S, n);
if (ans == int .MaxValue)
Console.WriteLine( "No Solution" );
else
Console.Write( "Largest d such that a + " +
"b + c = d is " + ans );
}
}
|
PHP
<?php
function findLargestd( $S , $n )
{
$found = false;
sort( $S );
for ( $i = $n - 1; $i >= 0; $i --)
{
for ( $j = 0; $j < $n ; $j ++)
{
if ( $i == $j )
continue ;
for ( $k = $j + 1; $k < $n ; $k ++)
{
if ( $i == $k )
continue ;
for ( $l = $k + 1; $l < $n ; $l ++)
{
if ( $i == $l )
continue ;
if ( $S [ $i ] == $S [ $j ] + $S [ $k ] + $S [ $l ])
{
$found = true;
return $S [ $i ];
}
}
}
}
}
if ( $found == false)
return PHP_INT_MIN;
}
$S = array ( 2, 3, 5, 7, 12 );
$n = count ( $S );
$ans = findLargestd( $S , $n );
if ( $ans == PHP_INT_MIN)
echo "No Solution" ;
else
echo "Largest d such that a + b + " ,
"c = d is " , $ans ;
?>
|
Javascript
<script>
function findLargestd(S, n)
{
let found = false ;
S.sort();
for (let i = n - 1; i >= 0; i--)
{
for (let j = 0; j < n; j++)
{
if (i == j)
continue ;
for (let k = j + 1; k < n; k++)
{
if (i == k)
continue ;
for (let l = k + 1; l < n; l++)
{
if (i == l)
continue ;
if (S[i] == S[j] + S[k] + S[l])
{
found = true ;
return S[i];
}
}
}
}
}
if (found == false )
return Number.MAX_VALUE;
return -1;
}
let S = [ 2, 3, 5, 7, 12 ];
let n = S.length;
let ans = findLargestd(S, n);
if (ans == Number.MAX_VALUE)
document.write( "No Solution" );
else
document.write( "Largest d such that a + " +
"b + c = d is " + ans );
</script>
|
Output :
Largest d such that a + b + c = d is 12
This brute force solution has a time complexity of O((size of Set)4).
Method 2(Efficient Approach – Using Hashing): The above problem statement (a + b + c = d) can be restated as finding a, b, c, d such that a + b = d – c. So this problem can be efficiently solved using hashing.
- Store sums of all pairs (a + b) in a hash table
- Traverse through all pairs (c, d) again and search for (d – c) in the hash table.
- If a pair is found with the required sum, then make sure that all elements are distinct array elements and an element is not considered more than once.
Below is the implementation of above approach.
C++
#include <bits/stdc++.h>
using namespace std;
int findFourElements( int arr[], int n)
{
unordered_map< int , pair< int , int > > mp;
for ( int i = 0; i < n - 1; i++)
for ( int j = i + 1; j < n; j++)
mp[arr[i] + arr[j]] = { i, j };
int d = INT_MIN;
for ( int i = 0; i < n - 1; i++) {
for ( int j = i + 1; j < n; j++) {
int abs_diff = abs (arr[i] - arr[j]);
if (mp.find(abs_diff) != mp.end()) {
pair< int , int > p = mp[abs_diff];
if (p.first != i && p.first != j &&
p.second != i && p.second != j)
d = max(d, max(arr[i], arr[j]));
}
}
}
return d;
}
int main()
{
int arr[] = { 2, 3, 5, 7, 12 };
int n = sizeof (arr) / sizeof (arr[0]);
int res = findFourElements(arr, n);
if (res == INT_MIN)
cout << "No Solution." ;
else
cout << res;
return 0;
}
|
Java
import java.util.HashMap;
import java.lang.Math;
class Indexes
{
int i, j;
Indexes( int i, int j)
{
this .i = i;
this .j = j;
}
int getI()
{
return i;
}
int getJ()
{
return j;
}
}
class GFG {
static int findFourElements( int [] arr, int n)
{
HashMap<Integer, Indexes> map = new HashMap<>();
for ( int i = 0 ; i < n - 1 ; i++)
{
for ( int j = i + 1 ; j < n; j++)
{
map.put(arr[i] + arr[j], new Indexes(i, j));
}
}
int d = Integer.MIN_VALUE;
for ( int i = 0 ; i < n - 1 ; i++)
{
for ( int j = i + 1 ; j < n; j++)
{
int abs_diff = Math.abs(arr[i] - arr[j]);
if (map.containsKey(abs_diff))
{
Indexes indexes = map.get(abs_diff);
if (indexes.getI() != i && indexes.getI() != j &&
indexes.getJ() != i && indexes.getJ() != j)
{
d = Math.max(d, Math.max(arr[i], arr[j]));
}
}
}
}
return d;
}
public static void main(String[] args)
{
int arr[] = { 2 , 3 , 5 , 7 , 12 };
int n = arr.length;
int res = findFourElements(arr, n);
if (res == Integer.MIN_VALUE)
System.out.println( "No Solution" );
else
System.out.println(res);
}
}
|
Python3
def findFourElements(arr, n):
mp = dict ()
for i in range (n - 1 ):
for j in range (i + 1 , n):
mp[arr[i] + arr[j]] = (i, j)
d = - 10 * * 9
for i in range (n - 1 ):
for j in range (i + 1 , n):
abs_diff = abs (arr[i] - arr[j])
if abs_diff in mp.keys():
p = mp[abs_diff]
if (p[ 0 ] ! = i and p[ 0 ] ! = j and
p[ 1 ] ! = i and p[ 1 ] ! = j):
d = max (d, max (arr[i], arr[j]))
return d
arr = [ 2 , 3 , 5 , 7 , 12 ]
n = len (arr)
res = findFourElements(arr, n)
if (res = = - 10 * * 9 ):
print ( "No Solution." )
else :
print (res)
|
C#
using System;
using System.Collections.Generic;
public class Indexes
{
int i, j;
public Indexes( int i, int j)
{
this .i = i;
this .j = j;
}
public int getI()
{
return i;
}
public int getJ()
{
return j;
}
}
public class GFG
{
static int findFourElements( int [] arr, int n)
{
Dictionary< int , Indexes> map =
new Dictionary< int , Indexes>();
for ( int i = 0; i < n - 1; i++)
{
for ( int j = i + 1; j < n; j++)
{
map.Add(arr[i] + arr[j],
new Indexes(i, j));
}
}
int d = int .MinValue;
for ( int i = 0; i < n - 1; i++)
{
for ( int j = i + 1; j < n; j++)
{
int abs_diff = Math.Abs(arr[i] - arr[j]);
if (map.ContainsKey(abs_diff))
{
Indexes indexes = map[abs_diff];
if (indexes.getI() != i &&
indexes.getI() != j &&
indexes.getJ() != i &&
indexes.getJ() != j)
{
d = Math.Max(d, Math.Max(arr[i],
arr[j]));
}
}
}
}
return d;
}
public static void Main(String[] args)
{
int []arr = { 2, 3, 5, 7, 12 };
int n = arr.Length;
int res = findFourElements(arr, n);
if (res == int .MinValue)
Console.WriteLine( "No Solution" );
else
Console.WriteLine(res);
}
}
|
Javascript
<script>
class Indexes
{
constructor(i,j)
{
this .i = i;
this .j = j;
}
getI()
{
return this .i;
}
getJ()
{
return this .j;
}
}
function findFourElements(arr,n)
{
let map = new Map();
for (let i = 0; i < n - 1; i++)
{
for (let j = i + 1; j < n; j++)
{
map.set(arr[i] + arr[j], new Indexes(i, j));
}
}
let d = Number.MIN_VALUE;
for (let i = 0; i < n - 1; i++)
{
for (let j = i + 1; j < n; j++)
{
let abs_diff = Math.abs(arr[i] - arr[j]);
if (map.has(abs_diff))
{
let indexes = map.get(abs_diff);
if (indexes.getI() != i && indexes.getI() != j &&
indexes.getJ() != i && indexes.getJ() != j)
{
d = Math.max(d, Math.max(arr[i], arr[j]));
}
}
}
}
return d;
}
let arr=[ 2, 3, 5, 7, 12];
let n = arr.length;
let res = findFourElements(arr, n);
if (res == Number.MIN_VALUE)
document.write( "No Solution" );
else
document.write(res);
</script>
|
The overall Time Complexity for this efficient approach is O(N2) (where N is the size of the set).
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...