Print triplets with sum less than k - GeeksforGeeks

24 May, 2021
Given an array of distinct integers and a sum value. Print all triplets with sum smaller than given sum value. Expected Time Complexity is O(n2).
Examples: 
Input : arr[] = {-2, 0, 1, 3}
        sum = 2.
Output : (-2, 0, 1)
         (-2, 0, 3) 
Explanation :  The two triplets have sum less than 2.

Input : arr[] = {5, 1, 3, 4, 7}
        sum = 12.
Output : (1, 3, 4)
         (1, 3, 5)
         (1, 3, 7) 
         (1, 4, 5)
               
A Simple Solution is to run three loops to consider all triplets one by one. For every triplet, compare the sums and print current triplet if its sum is smaller than given sum. 
C++
Java
Python3
C#
PHP
Javascript
// A Simple C++ program to count triplets with sum// smaller than a given value#include<bits/stdc++.h>using namespace std; int printTriplets(int arr[], int n, int sum){    // Fix the first element as A[i]    for (int i = 0; i < n-2; i++)    {       // Fix the second element as A[j]       for (int j = i+1; j < n-1; j++)       {           // Now look for the third number           for (int k = j+1; k < n; k++)               if (arr[i] + arr[j] + arr[k] < sum)                  cout << arr[i] << ", " << arr[j]                       << ", " << arr[k] << endl;       }    }} // Driver programint main(){    int arr[] = {5, 1, 3, 4, 7};    int n = sizeof arr / sizeof arr[0];    int sum = 12;    printTriplets(arr, n, sum);    return 0;}
// A Simple Java program to// count triplets with sum// smaller than a given valueimport java.io.*; class GFG{static int printTriplets(int arr[],                         int n, int sum){    // Fix the first    // element as A[i]    for (int i = 0; i < n - 2; i++)    {             // Fix the second    // element as A[j]    for (int j = i + 1;             j < n - 1; j++)    {        // Now look for        // the third number        for (int k = j + 1; k < n; k++)            if (arr[i] + arr[j] + arr[k] < sum)                System.out.println(arr[i] + ", " +                                   arr[j] + ", " +                                   arr[k]);    }    }    return 0;} // Driver Codepublic static void main (String[] args){    int arr[] = {5, 1, 3, 4, 7};    int n = arr.length;    int sum = 12;    printTriplets(arr, n, sum);}} // This code is contributed// by anuj_67.
# A Simple python 3 program to count# triplets with sum smaller than a# given value def printTriplets(arr, n, sum):         # Fix the first element as A[i]    for i in range(0, n - 2, 1):                 # Fix the second element as A[j]        for j in range(i + 1, n - 1, 1):                         # Now look for the third number            for k in range(j + 1, n, 1):                if (arr[i] + arr[j] + arr[k] < sum):                    print(arr[i], ",", arr[j], ",", arr[k])# Driver Codeif __name__ == '__main__':    arr =[5, 1, 3, 4, 7]    n = len(arr)    sum = 12    printTriplets(arr, n, sum)     # This code is contributed by# Sahil_Shelangia
// A Simple C# program to// count triplets with sum// smaller than a given valueusing System;class GFG{static int printTriplets(int[] arr,                        int n, int sum){    // Fix the first    // element as A[i]    for (int i = 0; i < n - 2; i++)    {             // Fix the second    // element as A[j]    for (int j = i + 1;            j < n - 1; j++)    {        // Now look for        // the third number        for (int k = j + 1; k < n; k++)            if (arr[i] + arr[j] + arr[k] < sum)                Console.WriteLine(arr[i] + ", " +                                arr[j] + ", " +                                arr[k]);    }    }    return 0;} // Driver Codepublic static void Main (){    int[] arr = {5, 1, 3, 4, 7};    int n = arr.Length;    int sum = 12;    printTriplets(arr, n, sum);}} // This code is contributed// by Mukul Singh.
<?php// A Simple PHP program to count triplets// with sum smaller than a given value function printTriplets(&$arr, $n, $sum){    // Fix the first element as A[i]    for ($i = 0; $i < $n - 2; $i++)    {    // Fix the second element as A[j]    for ($j = $i + 1; $j < $n - 1; $j++)    {        // Now look for the third number        for ($k = $j + 1; $k < $n; $k++)            if ($arr[$i] + $arr[$j] +                           $arr[$k] < $sum)            {                echo($arr[$i]);                echo(", " );                echo($arr[$j]);                echo(", ");                echo($arr[$k]);                echo("\n");            }    }    }} // Driver Code$arr = array(5, 1, 3, 4, 7);$n = sizeof($arr);$sum = 12;printTriplets($arr, $n, $sum); // This code is contributed// by Shivi_Aggarwal?>
<script> // A Simple JavaScript program to// count triplets with sum// smaller than a given value function printTriplets(arr, n, sum){    // Fix the first element as A[i]    for (let i = 0; i < n-2; i++)    {    // Fix the second element as A[j]    for (let j = i+1; j < n-1; j++)    {        // Now look for the third number        for (let k = j+1; k < n; k++)            if (arr[i] + arr[j] + arr[k] < sum)                document.write(arr[i] + ", " + arr[j]                    + ", " + arr[k] + "<br>");    }    }} // Driver program    let arr = [5, 1, 3, 4, 7];    let n = arr.length;    let sum = 12;    printTriplets(arr, n, sum);  // This code is contributed by Surbhi Tyagi. </script>
5, 1, 3
5, 1, 4
1, 3, 4
1, 3, 7
 
Time complexity of above solution is O(n3).
An Efficient Solution can print triplets in O(n2) by sorting the array first, and then using method 1 of this post in a loop.
1) Sort the input array in increasing order.
2) Initialize result as 0.
3) Run a loop from i = 0 to n-2.  An iteration of this loop 
   finds all triplets with arr[i] as first element.
     a) Initialize other two elements as corner elements
        of subarray
        arr[i+1..n-1], i.e., j = i+1 and k = n-1
     b) Move j and k toward each other until they meet,
        i.e., while (j = sum), then do k--

        // Else for current i and j, there are (k-j) possible  
        // third elements that satisfy the constraint.
        (ii) Else print elements from j to k
Below is the implementation of above idea. 
C++
Java
Python3
C#
PHP
Javascript
// C++ program to print triplets with sum smaller// than a given value#include <bits/stdc++.h>using namespace std; int printTriplets(int arr[], int n, int sum){    // Sort input array    sort(arr, arr + n);     // Every iteration of loop counts triplet with    // first element as arr[i].    for (int i = 0; i < n - 2; i++) {         // Initialize other two elements as corner        // elements of subarray arr[j+1..k]        int j = i + 1, k = n - 1;         // Use Meet in the Middle concept        while (j < k) {             // If sum of current triplet is more or equal,            // move right corner to look for smaller values            if (arr[i] + arr[j] + arr[k] >= sum)                k--;             // Else move left corner            else {                 // This is important. For current i and j,                // there are total k-j third elements.                for (int x = j + 1; x <= k; x++)                    cout << arr[i] << ", " << arr[j]                         << ", " << arr[x] << endl;                j++;            }        }    }} // Driver programint main(){    int arr[] = { 5, 1, 3, 4, 7 };    int n = sizeof arr / sizeof arr[0];    int sum = 12;    printTriplets(arr, n, sum);    return 0;}
// Java program to print// triplets with sum smaller// than a given valueimport java.util.*;import java.lang.*;import java.io.*; class GFG{static void printTriplets(int arr[],                          int n, int sum){    // Sort input array    Arrays.sort(arr);     // Every iteration of loop    // counts triplet with    // first element as arr[i].    for (int i = 0; i < n - 2; i++)    {         // Initialize other two elements        //  as corner elements of subarray        // arr[j+1..k]        int j = i + 1, k = n - 1;         // Use Meet in the        // Middle concept        while (j < k)        {             // If sum of current triplet            // is more or equal, move right            // corner to look for smaller values            if (arr[i] + arr[j] + arr[k] >= sum)                k--;             // Else move left corner            else            {                 // This is important. For                // current i and j, there                // are total k-j third elements.                for (int x = j + 1; x <= k; x++)                    System.out.println(arr[i] + ", " +                                       arr[j] + ", " +                                       arr[x]);                j++;            }        }    }} // Driver Codepublic static void main(String args[]){    int arr[] = { 5, 1, 3, 4, 7 };    int n = arr.length;    int sum = 12;    printTriplets(arr, n, sum);}} // This code is contributed// by Subhadeep
# Python3 program to print# triplets with sum smaller# than a given valuedef printTriplets(arr, n, sum):         # Sort input array    arr.sort()      # Every iteration of loop    # counts triplet with    # first element as arr[i].    for i in range(n - 2):         # Initialize other two elements        # as corner elements of subarray        # arr[j+1..k]        (j, k) = (i + 1, n - 1)          # Use Meet in the        # Middle concept        while (j < k):                     # If sum of current triplet            # is more or equal, move right            # corner to look for smaller values            if (arr[i] + arr[j] + arr[k] >= sum):                k -= 1              # Else move left corner            else:                  # This is important. For                # current i and j, there                # are total k-j third elements.                for x in range(j + 1, k + 1):                    print(str(arr[i]) + ", " +                          str(arr[j]) + ", " +                          str(arr[x]))                        j += 1 # Driver codeif __name__=="__main__":         arr = [ 5, 1, 3, 4, 7 ]    n = len(arr)    sum = 12         printTriplets(arr, n, sum); # This code is contributed by rutvik_56
// C# program to print// triplets with sum smaller// than a given valueusing System; class GFG{static void printTriplets(int[] arr,                        int n, int sum){    // Sort input array    Array.Sort(arr);     // Every iteration of loop    // counts triplet with    // first element as arr[i].    for (int i = 0; i < n - 2; i++)    {         // Initialize other two elements        // as corner elements of subarray        // arr[j+1..k]        int j = i + 1, k = n - 1;         // Use Meet in the        // Middle concept        while (j < k)        {             // If sum of current triplet            // is more or equal, move right            // corner to look for smaller values            if (arr[i] + arr[j] + arr[k] >= sum)                k--;             // Else move left corner            else            {                 // This is important. For                // current i and j, there                // are total k-j third elements.                for (int x = j + 1; x <= k; x++)                    Console.WriteLine(arr[i] + ", " +                                    arr[j] + ", " +                                    arr[x]);                j++;            }        }    }} // Driver Codepublic static void Main(){    int[] arr = { 5, 1, 3, 4, 7 };    int n = arr.Length;    int sum = 12;    printTriplets(arr, n, sum);}} // This code is contributed// by Akanksha Rai
<?php// PHP program to print triplets with// sum smaller than a given value function printTriplets($arr, $n, $sum){    // Sort input array    sort($arr, 0);     // Every iteration of loop counts    // triplet with first element as arr[i].    for ($i = 0; $i < $n - 2; $i++)    {         // Initialize other two elements as corner        // elements of subarray arr[j+1..k]        $j = $i + 1; $k = $n - 1;         // Use Meet in the Middle concept        while ($j < $k)        {             // If sum of current triplet is more            // or equal, move right corner to            // look for smaller values            if ($arr[$i] + $arr[$j] +                $arr[$k] >= $sum)                $k--;             // Else move left corner            else            {                 // This is important. For current i and j,                // there are total k-j third elements.                for ($x = $j + 1; $x <= $k; $x++)                    echo $arr[$i] . ", " . $arr[$j] .                              ", " . $arr[$x] . "\n";                $j++;            }        }    }} // Driver Code$arr = array(5, 1, 3, 4, 7);$n = sizeof($arr);$sum = 12;printTriplets($arr, $n, $sum); // This code is contributed// by Akanksha Rai?>
<script>     // JavaScript program to print    // triplets with sum smaller    // than a given value         function printTriplets(arr, n, sum)    {        // Sort input array        arr.sort(function(a, b){return a - b});         // Every iteration of loop        // counts triplet with        // first element as arr[i].        for (let i = 0; i < n - 2; i++)        {             // Initialize other two elements            // as corner elements of subarray            // arr[j+1..k]            let j = i + 1, k = n - 1;             // Use Meet in the            // Middle concept            while (j < k)            {                 // If sum of current triplet                // is more or equal, move right                // corner to look for smaller values                if (arr[i] + arr[j] + arr[k] >= sum)                    k--;                 // Else move left corner                else                {                     // This is important. For                    // current i and j, there                    // are total k-j third elements.                    for (let x = j + 1; x <= k; x++)                        document.write(arr[i] + ", " +                                        arr[j] + ", " +                                        arr[x] + "</br>");                    j++;                }            }        }    }         let arr = [ 5, 1, 3, 4, 7 ];    let n = arr.length;    let sum = 12;    printTriplets(arr, n, sum);     </script>
1, 3, 4
1, 3, 5
1, 3, 7
1, 4, 5
 
vt_m
tufan_gupta2000
sahilshelangia
Code_Mech
Shivi_Aggarwal
Akanksha_Rai
sundarlucifer
rutvik_56
surbhityagi15
divyeshrabadiya07
two-pointer-algorithm
Arrays
Sorting
two-pointer-algorithm
Arrays
Sorting
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Window Sliding Technique
Trapping Rain Water
Reversal algorithm for array rotation
Program to find sum of elements in a given array
Building Heap from Array