Given an array arr[] of N integers and an integer X, the task is to find three integers in arr[] such that the sum is closest to X.
Examples:
Input: arr[] = {-1, 2, 1, -4}, X = 1
Output: 2
Explanation:
Sums of triplets:
(-1) + 2 + 1 = 2
(-1) + 2 + (-4) = -3
2 + 1 + (-4) = -1
2 is closest to 1.
Input: arr[] = {1, 2, 3, 4, -5}, X = 10
Output: 9
Explanation:
Sums of triplets:
1 + 2 + 3 = 6
2 + 3 + 4 = 9
1 + 3 + 4 = 7
…
9 is closest to 10.
Find a triplet in an array whose sum is closest to a given number by explore all the subsets of size three:
The naive approach is to explore all the subsets of size three and keep a track of the difference between X and the sum of this subset. Then return the subset whose difference between its sum and X is minimum.
Step-by-step approach:
- Create three nested loops with counter i, j and k respectively.
- The first loop will start from start to end, the second loop will run from i+1 to end, the third loop will run from j+1 to end.
- Check if the difference of the sum of the ith, jth and kth element with the given sum is less than the current minimum or not. Update the current minimum
- Print the closest sum.
Below is the implementation of the above approach:
C++14
#include <bits/stdc++.h>
using namespace std;
int solution(vector< int >& arr, int x)
{
int closestSum = INT_MAX;
for ( int i = 0; i < arr.size() ; i++)
{
for ( int j =i + 1; j < arr.size(); j++)
{
for ( int k =j + 1; k < arr.size(); k++)
{
if ( abs (x - closestSum) > abs (x - (arr[i] + arr[j] + arr[k])))
closestSum = (arr[i] + arr[j] + arr[k]);
}
}
}
return closestSum;
}
int main()
{
vector< int > arr = { -1, 2, 1, -4 };
int x = 1;
cout << solution(arr, x);
return 0;
}
|
Java
class GFG{
public static int solution( int arr[], int x)
{
int closestSum = Integer.MAX_VALUE;
for ( int i = 0 ; i < arr.length ; i++)
{
for ( int j = i + 1 ; j < arr.length; j++)
{
for ( int k = j + 1 ; k < arr.length; k++)
{
if (Math.abs(x - closestSum) >
Math.abs(x - (arr[i] + arr[j] + arr[k])))
closestSum = (arr[i] + arr[j] + arr[k]);
}
}
}
return closestSum;
}
public static void main(String[] args)
{
int arr[] = { - 1 , 2 , 1 , - 4 };
int x = 1 ;
System.out.print(solution(arr, x));
}
}
|
Python3
import sys
def solution(arr, x):
closestSum = sys.maxsize
for i in range ( len (arr)) :
for j in range (i + 1 , len (arr)):
for k in range (j + 1 , len ( arr)):
if ( abs (x - closestSum) >
abs (x - (arr[i] +
arr[j] + arr[k]))):
closestSum = (arr[i] +
arr[j] + arr[k])
return closestSum
if __name__ = = "__main__" :
arr = [ - 1 , 2 , 1 , - 4 ]
x = 1
print (solution(arr, x))
|
C#
using System;
using System.Collections;
using System.Collections.Generic;
class GFG{
static int solution(ArrayList arr, int x)
{
int closestSum = int .MaxValue;
for ( int i = 0; i < arr.Count; i++)
{
for ( int j = i + 1; j < arr.Count; j++)
{
for ( int k = j + 1; k < arr.Count; k++)
{
if (Math.Abs(x - closestSum) >
Math.Abs(x - (( int )arr[i] +
( int )arr[j] + ( int )arr[k])))
{
closestSum = (( int )arr[i] +
( int )arr[j] +
( int )arr[k]);
}
}
}
}
return closestSum;
}
public static void Main( string [] args)
{
ArrayList arr = new ArrayList(){ -1, 2, 1, -4 };
int x = 1;
Console.Write(solution(arr, x));
}
}
|
Javascript
<script>
function solution(arr, x)
{
let closestSum = Number.MAX_VALUE;
for (let i = 0; i < arr.length ; i++)
{
for (let j =i + 1; j < arr.length; j++)
{
for (let k =j + 1; k < arr.length; k++)
{
if (Math.abs(x - closestSum) >
Math.abs(x - (arr[i] + arr[j] + arr[k])))
closestSum = (arr[i] + arr[j] + arr[k]);
}
}
}
return closestSum;
}
let arr = [ -1, 2, 1, -4 ];
let x = 1;
document.write(solution(arr, x));
</script>
|
Time complexity: O(N3). Three nested loops are traversing in the array, so time complexity is O(n^3).
Auxiliary Space: O(1). As no extra space is required.
Find a triplet in an array whose sum is closest to a given number using Sorting:
By Sorting the array the efficiency of the algorithm can be improved. This efficient approach uses the two-pointer technique. Traverse the array and fix the first element of the triplet. Now use the Two Pointers algorithm to find the closest number to x – array[i]. Update the closest sum. The two-pointers algorithm takes linear time so it is better than a nested loop.
Step-by-step approach:
- Sort the given array.
- Loop over the array and fix the first element of the possible triplet, arr[i].
- Then fix two pointers, one at I + 1 and the other at n – 1. And look at the sum,
- If the sum is smaller than the sum we need to get to, we increase the first pointer.
- Else, If the sum is bigger, Decrease the end pointer to reduce the sum.
- Update the closest sum found so far.
Below is the implementation of the above approach:
C++14
#include <bits/stdc++.h>
using namespace std;
int solution(vector< int >& arr, int x)
{
sort(arr.begin(), arr.end());
int closestSum = 1000000000;
for ( int i = 0; i < arr.size() - 2; i++) {
int ptr1 = i + 1, ptr2 = arr.size() - 1;
while (ptr1 < ptr2) {
int sum = arr[i] + arr[ptr1] + arr[ptr2];
if (sum == x)
return sum;
if ( abs (x - sum) < abs (x - closestSum)) {
closestSum = sum;
}
if (sum > x) {
ptr2--;
}
else {
ptr1++;
}
}
}
return closestSum;
}
int main()
{
vector< int > arr = { -1, 2, 1, -4 };
int x = 1;
cout << solution(arr, x);
return 0;
}
|
Java
import static java.lang.Math.abs;
import java.util.*;
class GFG
{
static int solution(Vector<Integer> arr, int x)
{
Collections.sort(arr);
long closestSum = Integer.MAX_VALUE;
for ( int i = 0 ; i < arr.size() - 2 ; i++)
{
int ptr1 = i + 1 , ptr2 = arr.size() - 1 ;
while (ptr1 < ptr2)
{
int sum = arr.get(i) + arr.get(ptr1) + arr.get(ptr2);
if (abs(x - sum) < abs(x - closestSum))
{
closestSum = sum;
}
if (sum > x)
{
ptr2--;
}
else
{
ptr1++;
}
}
}
return ( int )closestSum;
}
public static void main(String[] args)
{
Vector arr = new Vector(Arrays.asList( - 1 , 2 , 1 , - 4 ));
int x = 1 ;
System.out.println(solution(arr, x));
}
}
|
Python3
import sys
def solution(arr, x) :
arr.sort();
closestSum = sys.maxsize;
for i in range ( len (arr) - 2 ) :
ptr1 = i + 1 ; ptr2 = len (arr) - 1 ;
while (ptr1 < ptr2) :
sum = arr[i] + arr[ptr1] + arr[ptr2];
if ( abs (x - sum ) < abs (x - closestSum)) :
closestSum = sum ;
if ( sum > x) :
ptr2 - = 1 ;
else :
ptr1 + = 1 ;
return closestSum;
if __name__ = = "__main__" :
arr = [ - 1 , 2 , 1 , - 4 ];
x = 1 ;
print (solution(arr, x));
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int solution(List< int > arr, int x)
{
arr.Sort();
int closestSum = int .MaxValue;
for ( int i = 0; i < arr.Count - 2; i++)
{
int ptr1 = i + 1, ptr2 = arr.Count - 1;
while (ptr1 < ptr2)
{
int sum = arr[i] + arr[ptr1] + arr[ptr2];
if (Math.Abs(x - sum) <
Math.Abs(x - closestSum))
{
closestSum = sum;
}
if (sum > x)
{
ptr2--;
}
else
{
ptr1++;
}
}
}
return closestSum;
}
public static void Main(String[] args)
{
int []ar = { -1, 2, 1, -4 };
List< int > arr = new List< int >(ar);
int x = 1;
Console.WriteLine(solution(arr, x));
}
}
|
Javascript
<script>
function solution(arr, x)
{
arr.sort((a, b) => a - b);
let closestSum = 1000000000;
for (let i = 0; i < arr.length - 2; i++)
{
let ptr1 = i + 1, ptr2 = arr.length - 1;
while (ptr1 < ptr2) {
let sum = arr[i] + arr[ptr1] + arr[ptr2];
if (Math.abs(1*x - sum) < Math.abs(1*x - closestSum))
{
closestSum = sum;
}
if (sum > x) {
ptr2--;
}
else {
ptr1++;
}
}
}
return closestSum;
}
let arr = [ -1, 2, 1, -4 ];
let x = 1;
document.write(solution(arr, x));
</script>
|
Time complexity: O(N2). There are only two nested loops traversing the array, so time complexity is O(n^2). Two pointer algorithm take O(n) time and the first element can be fixed using another nested traversal.
Auxiliary Space: O(1). As no extra space is required.
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 :
30 Oct, 2023
Like Article
Save Article