Open In App

Find largest d in array such that a + b + c = d

Improve
Improve
Like Article
Like
Save
Share
Report

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++




// CPP Program to find the largest d
// such that d = a + b + c
#include <bits/stdc++.h>
using namespace std;
 
int findLargestd(int S[], int n)
{
    bool found = false;
 
    // sort the array in
    // ascending order
    sort(S, S + n);
 
    // iterating from backwards to
    // find the required largest d
    for (int i = n - 1; i >= 0; i--)
    {
        for (int j = 0; j < n; j++)
        {
 
            // since all four a, b, c,
            // d should be distinct
            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 the current combination 
                    // of j, k, l in the set is
                    // equal to S[i] return this
                    // value as this would be the
                    // largest d since we are
                    //  iterating in descending order
                    if (S[i] == S[j] + S[k] + S[l])
                    {
                        found = true;
                        return S[i];
                    }
                }
            }
        }
    }
    if (found == false)
        return INT_MIN;
}
 
// Driver Code
int main()
{
    // Set of distinct Integers
    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




// Java Program to find the largest
// such that d = a + b + c
import java.io.*;
import java.util.Arrays;
 
class GFG
{
     
// function to find largest d
static int findLargestd(int []S, int n)
{
    boolean found = false;
 
    // sort the array in
    // ascending order
    Arrays.sort(S);
 
    // iterating from backwards to
    // find the required largest d
    for (int i = n - 1; i >= 0; i--)
    {
        for (int j = 0; j < n; j++)
        {
 
            // since all four a, b, c,
            // d should be distinct
            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 the current combination 
                    // of j, k, l in the set is
                    // equal to S[i] return this
                    // value as this would be the
                    // largest d since we are 
                    // iterating in descending order
                    if (S[i] == S[j] + S[k] + S[l])
                    {
                        found = true;
                        return S[i];
                    }
                }
            }
        }
    }
    if (found == false)
        return Integer.MAX_VALUE;
 
    return -1;
}
 
// Driver Code
public static void main(String []args)
{
    // Set of distinct Integers
    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 );
         
}
}
 
// This code is contributed by Sam007


Python3




# Python Program to find the largest
# d such that d = a + b + c
 
def findLargestd(S, n) :
    found = False
 
    # sort the array in ascending order
    S.sort()
 
    # iterating from backwards to
    # find the required largest d
    for i in range(n-1, -1, -1) :
        for j in range(0, n) :
 
            # since all four a, b, c,
            # d should be distinct
            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 the current combination
                    # of j, k, l in the set is
                    # equal to S[i] return this
                    # value as this would be the
                    # largest d since we are
                    # iterating in descending order
                    if (S[i] == S[j] + S[k] + S[l]) :
                        found = True
                        return S[i]                
 
    if (found == False) :
        return -1
 
# Driver Code
 
# Set of distinct Integers
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)
 
# This code is contributed by Manish Shaw
# (manishshaw1)


C#




// C# Program to find the largest
// such that d = a + b + c
using System;
 
class GFG
{
     
// function to find largest d
static int findLargestd(int []S,
                        int n)
{
    bool found = false;
 
    // sort the array
    // in ascending order
    Array.Sort(S);
 
    // iterating from backwards to
    // find the required largest d
    for (int i = n - 1; i >= 0; i--)
    {
        for (int j = 0; j < n; j++)
        {
 
            // since all four a, b, c,
            // d should be distinct
            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 the current combination
                    // of j, k, l in the set is
                    // equal to S[i] return this
                    // value as this would be the
                    // largest dsince we are 
                    // iterating in descending order
                    if (S[i] == S[j] + S[k] + S[l])
                    {
                        found = true;
                        return S[i];
                    }
                }
            }
        }
    }
    if (found == false)
        return int.MaxValue;
 
    return -1;
}
 
// Driver Code
public static void Main()
{
    // Set of distinct Integers
    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 );
         
}
}
 
// This code is contributed by Sam007


PHP




<?php
// PHP Program to find the largest
// d such that d = a + b + c
 
function findLargestd( $S, $n)
{
$found = false;
 
    // sort the array in
    // ascending order
    sort($S);
 
    // iterating from backwards to
    // find the required largest d
    for ( $i = $n - 1; $i >= 0; $i--)
    {
        for ( $j = 0; $j < $n; $j++)
        {
 
            // since all four a, b, c, 
            // d should be distinct
            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 the current combination
                    // of j, k, l in the set is
                    // equal to S[i] return this
                    // value as this would be the
                    // largest d since we are 
                    // iterating in descending order
                    if ($S[$i] == $S[$j] + $S[$k] + $S[$l])
                    {
                        $found = true;
                        return $S[$i];
                    }
                }
            }
        }
    }
    if ($found == false)
        return PHP_INT_MIN;
}
 
// Driver Code
 
// Set of distinct Integers
$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 ;
 
// This code is contributed by anuj_67.
?>


Javascript




<script>
    // Javascript Program to find the largest
    // such that d = a + b + c
     
    // function to find largest d
    function findLargestd(S, n)
    {
        let found = false;
 
        // sort the array
        // in ascending order
        S.sort();
 
        // iterating from backwards to
        // find the required largest d
        for (let i = n - 1; i >= 0; i--)
        {
            for (let j = 0; j < n; j++)
            {
 
                // since all four a, b, c,
                // d should be distinct
                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 the current combination
                        // of j, k, l in the set is
                        // equal to S[i] return this
                        // value as this would be the
                        // largest dsince we are 
                        // iterating in descending order
                        if (S[i] == S[j] + S[k] + S[l])
                        {
                            found = true;
                            return S[i];
                        }
                    }
                }
            }
        }
        if (found == false)
            return Number.MAX_VALUE;
 
        return -1;
    }
     
    // Set of distinct Integers
    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. 

  1. Store sums of all pairs (a + b) in a hash table
  2. Traverse through all pairs (c, d) again and search for (d – c) in the hash table.
  3. 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++




// A hashing based CPP program to find largest d
// such that a + b + c = d.
#include <bits/stdc++.h>
using namespace std;
 
// The function finds four elements with given sum X
int findFourElements(int arr[], int n)
{
    // Store sums  (a+b) of all pairs (a,b) in a
    // hash table
    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 };
 
    // Traverse through all pairs and find (d -c)
    // is present in hash table
    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 d - c is present in hash table,
            if (mp.find(abs_diff) != mp.end()) {
 
                // Making sure that all elements are
                // distinct array elements and an element
                // is not considered more than once.
                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;
}
 
// Driver program to test above function
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




// A hashing based Java program to find largest d
// such that a + b + c = d.
import java.util.HashMap;
import java.lang.Math;
 
// To store and retrieve indices pair i & j
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 {
 
    // The function finds four elements with given sum X
    static int findFourElements(int[] arr, int n)
    {
        HashMap<Integer, Indexes> map = new HashMap<>();
 
        // Store sums (a+b) of all pairs (a,b) in a
        // hash table
        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;
         
        // Traverse through all pairs and find (d -c)
        // is present in hash table
        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 d - c is present in hash table,
                if (map.containsKey(abs_diff))
                {
                    Indexes indexes = map.get(abs_diff);
                     
                    // Making sure that all elements are
                    // distinct array elements and an element
                    // is not considered more than once.
                    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;
    }
 
    // Driver code
    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);
    }
}
 
// This code is contributed by Vivekkumar Singh


Python3




# A hashing based Python3 program to find
# largest d, such that a + b + c = d.
 
# The function finds four elements
# with given sum X
def findFourElements(arr, n):
 
    # Store sums (a+b) of all pairs (a,b) in a
    # hash table
    mp = dict()
    for i in range(n - 1):
        for j in range(i + 1, n):
            mp[arr[i] + arr[j]] =(i, j)
 
    # Traverse through all pairs and find (d -c)
    # is present in hash table
    d = -10**9
    for i in range(n - 1):
        for j in range(i + 1, n):
            abs_diff = abs(arr[i] - arr[j])
 
            # If d - c is present in hash table,
            if abs_diff in mp.keys():
 
                # Making sure that all elements are
                # distinct array elements and an element
                # is not considered more than once.
                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
 
# Driver Code
arr = [2, 3, 5, 7, 12]
n = len(arr)
res = findFourElements(arr, n)
if (res == -10**9):
    print("No Solution.")
else:
    print(res)
 
# This code is contributed by Mohit Kumar


C#




// A hashing based C# program to find
// largest d such that a + b + c = d.
using System;
using System.Collections.Generic;
 
// To store and retrieve
// indices pair i & j
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
{
 
    // The function finds four elements
    // with given sum X
    static int findFourElements(int[] arr, int n)
    {
        Dictionary<int, Indexes> map =
                    new Dictionary<int, Indexes>();
 
        // Store sums (a+b) of all pairs
        // (a,b) in a hash table
        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;
         
        // Traverse through all pairs and
        // find (d -c) is present in hash table
        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 d - c is present in hash table,
                if (map.ContainsKey(abs_diff))
                {
                    Indexes indexes = map[abs_diff];
                     
                    // Making sure that all elements are
                    // distinct array elements and an element
                    // is not considered more than once.
                    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;
    }
 
    // Driver code
    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);
    }
}
 
// This code is contributed by 29AjayKumar


Javascript




<script>
// A hashing based Javascript program to find largest d
// such that a + b + c = d.
 
// To store and retrieve indices pair i & j
class Indexes
{
       constructor(i,j)
    {
        this.i = i;
        this.j = j;
    }
  
    getI()
    {
        return this.i;
    }
  
    getJ()
    {
        return this.j;
    }
}
 
// The function finds four elements with given sum X
function findFourElements(arr,n)
{
    let map = new Map();
  
        // Store sums (a+b) of all pairs (a,b) in a
        // hash table
        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;
          
        // Traverse through all pairs and find (d -c)
        // is present in hash table
        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 d - c is present in hash table,
                if (map.has(abs_diff))
                {
                    let indexes = map.get(abs_diff);
                      
                    // Making sure that all elements are
                    // distinct array elements and an element
                    // is not considered more than once.
                    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;
}
 
// Driver code
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);
 
// This code is contributed by patel2127
</script>


Output: 

12

 

The overall Time Complexity for this efficient approach is O(N2) (where N is the size of the set).



Last Updated : 07 Mar, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads