Java Program to Find a triplet that sum to a given value - GeeksforGeeks

21 Dec, 2021
Given an array and a value, find if there is a triplet in array whose sum is equal to the given value. If there is such a triplet present in array, then print the triplet and return true. Else return false.
Examples:  
Input: array = {12, 3, 4, 1, 6, 9}, sum = 24; Output: 12, 3, 9 Explanation: There is a triplet (12, 3 and 9) present in the array whose sum is 24. Input: array = {1, 2, 3, 4, 5}, sum = 9 Output: 5, 3, 1 Explanation: There is a triplet (5, 3 and 1) present in the array whose sum is 9.
 
 
Method 1: This is the naive approach towards solving the above problem.  
 
Approach: A simple method is to generate all possible triplets and compare the sum of every triplet with the given value. The following code implements this simple method using three nested loops.
Algorithm: Given an array of length n and a sum sCreate three nested loop first loop runs from start to end (loop counter i), second loop runs from i+1 to end (loop counter j) and third loop runs from j+1 to end (loop counter k)The counter of these loops represents the index of 3 elements of the triplets.Find the sum of ith, jth and kth element. If the sum is equal to given sum. Print the triplet and break.If there is no triplet, then print that no triplet exist.
Given an array of length n and a sum sCreate three nested loop first loop runs from start to end (loop counter i), second loop runs from i+1 to end (loop counter j) and third loop runs from j+1 to end (loop counter k)The counter of these loops represents the index of 3 elements of the triplets.Find the sum of ith, jth and kth element. If the sum is equal to given sum. Print the triplet and break.If there is no triplet, then print that no triplet exist.
Given an array of length n and a sum s
Create three nested loop first loop runs from start to end (loop counter i), second loop runs from i+1 to end (loop counter j) and third loop runs from j+1 to end (loop counter k)
The counter of these loops represents the index of 3 elements of the triplets.
Find the sum of ith, jth and kth element. If the sum is equal to given sum. Print the triplet and break.
If there is no triplet, then print that no triplet exist.
Implementation:
Java
// Java program to find a tripletclass FindTriplet {      // returns true if there is triplet with sum equal    // to 'sum' present in A[]. Also, prints the triplet    boolean find3Numbers(int A[], int arr_size, int sum)    {        int l, r;          // Fix the first element as A[i]        for (int i = 0; i < arr_size - 2; i++) {              // Fix the second element as A[j]            for (int j = i + 1; j < arr_size - 1; j++) {                  // Now look for the third number                for (int k = j + 1; k < arr_size; k++) {                    if (A[i] + A[j] + A[k] == sum) {                        System.out.print("Triplet is " + A[i] + ", " + A[j] + ", " + A[k]);                        return true;                    }                }            }        }          // If we reach here, then no triplet was found        return false;    }      // Driver program to test above functions    public static void main(String[] args)    {        FindTriplet triplet = new FindTriplet();        int A[] = { 1, 4, 45, 6, 10, 8 };        int sum = 22;        int arr_size = A.length;          triplet.find3Numbers(A, arr_size, sum);    }}
Triplet is 4, 10, 8
 
Complexity Analysis: Time Complexity: O(n3). There are three nested loops traversing the array, so the time complexity is O(n^3)Space Complexity: O(1). As no extra space is required.
Time Complexity: O(n3). There are three nested loops traversing the array, so the time complexity is O(n^3)
Space Complexity: O(1). As no extra space is required.
Method 2: This method uses sorting to increase the efficiency of the code. 
Approach: 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 if there is a pair whose sum is equal to x – array[i]. Two pointers algorithm take linear time so it is better than a nested loop.
Algorithm : 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 required sum, increment the first pointer.Else, If the sum is bigger, Decrease the end pointer to reduce the sum.Else, if the sum of elements at two-pointer is equal to given sum then print the triplet and break.
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 required sum, increment the first pointer.Else, If the sum is bigger, Decrease the end pointer to reduce the sum.Else, if the sum of elements at two-pointer is equal to given sum then print the triplet and break.
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 required sum, increment the first pointer.Else, If the sum is bigger, Decrease the end pointer to reduce the sum.Else, if the sum of elements at two-pointer is equal to given sum then print the triplet and break.
If the sum is smaller than the required sum, increment the first pointer.Else, If the sum is bigger, Decrease the end pointer to reduce the sum.Else, if the sum of elements at two-pointer is equal to given sum then print the triplet and break.
If the sum is smaller than the required sum, increment the first pointer.
Else, If the sum is bigger, Decrease the end pointer to reduce the sum.
Else, if the sum of elements at two-pointer is equal to given sum then print the triplet and break.
Implementation:
Java
// Java program to find a tripletclass FindTriplet {      // returns true if there is triplet with sum equal    // to 'sum' present in A[]. Also, prints the triplet    boolean find3Numbers(int A[], int arr_size, int sum)    {        int l, r;          /* Sort the elements */        quickSort(A, 0, arr_size - 1);          /* Now fix the first element one by one and find the           other two elements */        for (int i = 0; i < arr_size - 2; i++) {              // To find the other two elements, start two index variables            // from two corners of the array and move them toward each            // other            l = i + 1; // index of the first element in the remaining elements            r = arr_size - 1; // index of the last element            while (l < r) {                if (A[i] + A[l] + A[r] == sum) {                    System.out.print("Triplet is " + A[i] + ", " + A[l] + ", " + A[r]);                    return true;                }                else if (A[i] + A[l] + A[r] < sum)                    l++;                  else // A[i] + A[l] + A[r] > sum                    r--;            }        }          // If we reach here, then no triplet was found        return false;    }      int partition(int A[], int si, int ei)    {        int x = A[ei];        int i = (si - 1);        int j;          for (j = si; j <= ei - 1; j++) {            if (A[j] <= x) {                i++;                int temp = A[i];                A[i] = A[j];                A[j] = temp;            }        }        int temp = A[i + 1];        A[i + 1] = A[ei];        A[ei] = temp;        return (i + 1);    }      /* Implementation of Quick Sort    A[] --> Array to be sorted    si  --> Starting index    ei  --> Ending index     */    void quickSort(int A[], int si, int ei)    {        int pi;          /* Partitioning index */        if (si < ei) {            pi = partition(A, si, ei);            quickSort(A, si, pi - 1);            quickSort(A, pi + 1, ei);        }    }      // Driver program to test above functions    public static void main(String[] args)    {        FindTriplet triplet = new FindTriplet();        int A[] = { 1, 4, 45, 6, 10, 8 };        int sum = 22;        int arr_size = A.length;          triplet.find3Numbers(A, arr_size, sum);    }}
Triplet is 4, 8, 10
Complexity Analysis: Time complexity: O(N^2). There are only two nested loops traversing the array, so time complexity is O(n^2). Two pointers algorithm takes O(n) time and the first element can be fixed using another nested traversal.Space Complexity: O(1). As no extra space is required.
Time complexity: O(N^2). There are only two nested loops traversing the array, so time complexity is O(n^2). Two pointers algorithm takes O(n) time and the first element can be fixed using another nested traversal.
Space Complexity: O(1). As no extra space is required.
Method 3: This is a Hashing-based solution. 
Approach: This approach uses extra space but is simpler than the two-pointers approach. Run two loops outer loop from start to end and inner loop from i+1 to end. Create a hashmap or set to store the elements in between i+1 to j-1. So if the given sum is x, check if there is a number in the set which is equal to x – arr[i] – arr[j]. If yes print the triplet.  
Algorithm: Traverse the array from start to end. (loop counter i)Create a HashMap or set to store unique pairs.Run another loop from i+1 to end of the array. (loop counter j)If there is an element in the set which is equal to x- arr[i] – arr[j], then print the triplet (arr[i], arr[j], x-arr[i]-arr[j]) and breakInsert the jth element in the set.
Traverse the array from start to end. (loop counter i)Create a HashMap or set to store unique pairs.Run another loop from i+1 to end of the array. (loop counter j)If there is an element in the set which is equal to x- arr[i] – arr[j], then print the triplet (arr[i], arr[j], x-arr[i]-arr[j]) and breakInsert the jth element in the set.
Traverse the array from start to end. (loop counter i)
Create a HashMap or set to store unique pairs.
Run another loop from i+1 to end of the array. (loop counter j)
If there is an element in the set which is equal to x- arr[i] – arr[j], then print the triplet (arr[i], arr[j], x-arr[i]-arr[j]) and break
Insert the jth element in the set.
Implementation:
Java
// Java program to find a triplet using Hashingimport java.util.*;  class GFG {      // returns true if there is triplet    // with sum equal to 'sum' present    // in A[]. Also, prints the triplet    static boolean find3Numbers(int A[],                                int arr_size, int sum)    {        // Fix the first element as A[i]        for (int i = 0; i < arr_size - 2; i++) {              // Find pair in subarray A[i+1..n-1]            // with sum equal to sum - A[i]            HashSet<Integer> s = new HashSet<Integer>();            int curr_sum = sum - A[i];            for (int j = i + 1; j < arr_size; j++)             {                if (s.contains(curr_sum - A[j]))                 {                    System.out.printf("Triplet is %d,                                         %d, %d", A[i],                                      A[j], curr_sum - A[j]);                    return true;                }                s.add(A[j]);            }        }          // If we reach here, then no triplet was found        return false;    }      /* Driver code */    public static void main(String[] args)    {        int A[] = { 1, 4, 45, 6, 10, 8 };        int sum = 22;        int arr_size = A.length;          find3Numbers(A, arr_size, sum);    }}  // This code has been contributed by 29AjayKumar
Output:
Triplet is 4, 8, 10
Time complexity: O(N^2) Auxiliary Space: O(N) 
Please refer complete article on Find a triplet that sum to a given value for more details!
Accolite
Amazon
CarWale
Morgan Stanley
Samsung
two-pointer-algorithm
Arrays
Java
Java Programs
Sorting
Morgan Stanley
Accolite
Amazon
Samsung
CarWale
two-pointer-algorithm
Arrays
Sorting
Java
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Window Sliding Technique
Program to find sum of elements in a given array
Reversal algorithm for array rotation
Trapping Rain Water
Move all negative numbers to beginning and positive to end with constant extra space
Split() String method in Java with examples
For-each loop in Java
Arrays.sort() in Java with examples
Reverse a string in Java
HashMap in Java with Examples