Count triplets with sum smaller than a given value - GeeksforGeeks

14 Jun, 2021
Given an array of distinct integers and a sum value. Find count of triplets with sum smaller than given sum value. The expected Time Complexity is O(n2).Examples:  
Input : arr[] = {-2, 0, 1, 3}
        sum = 2.
Output : 2
Explanation :  Below are triplets with sum less than 2
               (-2, 0, 1) and (-2, 0, 3) 

Input : arr[] = {5, 1, 3, 4, 7}
        sum = 12.
Output : 4
Explanation :  Below are triplets with sum less than 12
               (1, 3, 4), (1, 3, 5), (1, 3, 7) and 
               (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 increment count if the triplet sum is smaller than the given sum.  
C++
Java
Python 3
C#
Javascript
// A Simple C++ program to count triplets with sum smaller// than a given value#include<bits/stdc++.h>using namespace std; int countTriplets(int arr[], int n, int sum){    // Initialize result    int ans = 0;     // 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)                   ans++;       }    }     return ans;} // Driver programint main(){    int arr[] = {5, 1, 3, 4, 7};    int n = sizeof arr / sizeof arr[0];    int sum = 12;    cout << countTriplets(arr, n, sum) << endl;    return 0;}
// A Simple Java program to count triplets with sum smaller// than a given value class Test{    static int arr[] = new int[]{5, 1, 3, 4, 7};         static int countTriplets(int n, int sum)    {        // Initialize result        int ans = 0;              // 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)                       ans++;           }        }              return ans;    }         // Driver method to test the above function    public static void main(String[] args)    {        int sum = 12;        System.out.println(countTriplets(arr.length, sum));    }}
# A Simple Python 3 program to count triplets with sum smaller# than a given value#include<bits/stdc++.h>def countTriplets(arr, n, sum):     # Initialize result    ans = 0     # Fix the first element as A[i]    for i in range( 0 ,n-2):             # Fix the second element as A[j]        for j in range( i+1 ,n-1):                 # Now look for the third number            for k in range( j+1, n):                if (arr[i] + arr[j] + arr[k] < sum):                    ans+=1         return ans # Driver programarr = [5, 1, 3, 4, 7]n = len(arr)sum = 12print(countTriplets(arr, n, sum)) #Contributed by Smitha
// A Simple C# program to count triplets with sum smaller// than a given value  using System;class Test{    static int[] arr = new int[]{5, 1, 3, 4, 7};          static int countTriplets(int n, int sum)    {        // Initialize result        int ans = 0;               // 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)                       ans++;           }        }               return ans;    }          // Driver method to test the above function    public static void Main()    {        int sum = 12;        Console.Write(countTriplets(arr.Length, sum));    }}
<script>// A Simple Javascript program to count triplets with sum smaller// than a given value    let arr = [5, 1, 3, 4, 7];         function countTriplets(n,sum)    {             // Initialize result        let ans = 0;                // 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)                       ans++;           }        }        return ans;    }         // Driver method to test the above function    let sum = 12;    document.write(countTriplets(arr.length, sum));         // This code is contributed by avanitrachhadiya2155  </script>
Output: 
4
The time complexity of the above solution is O(n3). An Efficient Solution can count 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<k),
            (i) If arr[i] + arr[j] + arr[k] >= sum
                then k--
            // Else for current i and j, there can (k-j) possible third elements
            // that satisfy the constraint.
            (ii) Else Do ans += (k - j) followed by j++ 
Below is the implementation of the above idea.  
C++
Java
Python3
C#
Javascript
// C++ program to count triplets with sum smaller than a given value#include<bits/stdc++.h>using namespace std; int countTriplets(int arr[], int n, int sum){    // Sort input array    sort(arr, arr+n);     // Initialize result    int ans = 0;     // 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                // can be total k-j third elements.                ans += (k - j);                j++;            }        }    }    return ans;} // Driver programint main(){    int arr[] = {5, 1, 3, 4, 7};    int n = sizeof arr / sizeof arr[0];    int sum = 12;    cout << countTriplets(arr, n, sum) << endl;    return 0;}
// A Simple Java program to count triplets with sum smaller// than a given value import java.util.Arrays; class Test{    static int arr[] = new int[]{5, 1, 3, 4, 7};         static int countTriplets(int n, int sum)    {        // Sort input array        Arrays.sort(arr);              // Initialize result        int ans = 0;              // 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                    // can be total k-j third elements.                    ans += (k - j);                    j++;                }            }        }        return ans;    }         // Driver method to test the above function    public static void main(String[] args)    {        int sum = 12;        System.out.println(countTriplets(arr.length, sum));    }}
# Python3 program to count triplets with# sum smaller than a given value  # Function to count triplets with sum smaller# than a given value        def countTriplets(arr,n,sum):         # Sort input array    arr.sort()         # Initialize result    ans = 0         # Every iteration of loop counts triplet with    # first element as arr[i].    for i in range(0,n-2):                 # 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 = k-1                         # Else move left corner            else:                                 # This is important. For current i and j, there                # can be total k-j third elements.                ans += (k - j)                j = j+1         return ans # Driver programif __name__=='__main__':    arr = [5, 1, 3, 4, 7]    n = len(arr)    sum = 12    print(countTriplets(arr, n, sum))     # This code is contributed by# Yatin Gupta
// A Simple C# program to count// triplets with sum smaller// than a given valueusing System; class GFG{    static int []arr = new int[]{5, 1, 3, 4, 7};         static int countTriplets(int n, int sum)    {        // Sort input array        Array.Sort(arr);             // Initialize result        int ans = 0;             // 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                    // can be total k-j third elements.                    ans += (k - j);                    j++;                }            }        }        return ans;    }         // Driver Code    public static void Main()    {        int sum = 12;        Console.Write(countTriplets(arr.Length, sum));    }} // This code is contributed by Smitha
<script>// A Simple Javascript program to count triplets with sum smaller// than a given value    let arr = [5, 1, 3, 4, 7];         function countTriplets(n,sum)    {             // Sort input array        arr.sort(function(a,b){return b-a});                 // Initialize result        let ans = 0;                 // 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                    // can be total k-j third elements.                    ans += (k - j);                    j++;                }            }        }        return ans;    }         // Driver method to test the above function    let sum = 12;    document.write(countTriplets(arr.length, sum));         // This code is contributed by rag2127</script>
Output: 
4
 
YouTubeGeeksforGeeks500K subscribersCount triplets with sum smaller than a given value | GeeksforGeeksWatch laterShareCopy linkInfoShoppingTap to unmuteIf playback doesn't begin shortly, try restarting your device.You're signed outVideos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer.CancelConfirmMore videosMore videosSwitch cameraShareInclude playlistAn error occurred while retrieving sharing information. Please try again later.Watch on0:000:000:00 / 8:48•Live•<div class="player-unavailable"><h1 class="message">An error occurred.</h1><div class="submessage"><a href="https://www.youtube.com/watch?v=7nso5Dgc6CI" target="_blank">Try watching this video on www.youtube.com</a>, or enable JavaScript if it is disabled in your browser.</div></div>
Thanks to Gaurav Ahirwar for suggesting this solution.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above 
Smitha Dinesh Semwal
YatinGupta
ukasp
AnuragTripathy
avanitrachhadiya2155
rag2127
iamdhavalparmar
Amazon
SAP Labs
Arrays
Amazon
SAP Labs
Arrays
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Stack Data Structure (Introduction and Program)
Top 50 Array Coding Problems for Interviews
Introduction to Arrays
Multidimensional Arrays in Java
Linear Search
Given an array A[] and a number x, check for pair in A[] with sum as x (aka Two Sum)
Linked List vs Array
Python | Using 2D arrays/lists the right way
Maximum and minimum of an array using minimum number of comparisons
Given an array of size n and a number k, find all elements that appear more than n/k times