Count number of triplets in an array having sum in the range [a, b] - GeeksforGeeks

11 Aug, 2021
Given an array of distinct integers and a range [a, b], the task is to count the number of triplets having a sum in the range [a, b].Examples:  
Input : arr[] = {8, 3, 5, 2}
        range = [7, 11]
Output : 1
There is only one triplet {2, 3, 5}
having sum 10 in range [7, 11].

Input : arr[] = {2, 7, 5, 3, 8, 4, 1, 9}
        range = [8, 16]
Output : 36
 
A naive approach is to run three loops to consider all the triplets one by one. Find the sum of each triplet and increment the count if the sum lies in a given range [a, b].Below is the implementation of the above approach: 
C++
Java
Python3
C#
PHP
Javascript
// C++ program to count triplets with// sum that lies in given range [a, b].#include <bits/stdc++.h> using namespace std; // Function to count tripletsint countTriplets(int arr[], int n, int a, int b){    // 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] >= a                    && arr[i] + arr[j] + arr[k] <= b)                    ans++;        }    }     return ans;} // Driver Codeint main(){    int arr[] = { 2, 7, 5, 3, 8, 4, 1, 9 };    int n = sizeof arr / sizeof arr[0];    int a = 8, b = 16;    cout << countTriplets(arr, n, a, b) << endl;    return 0;}
// Java program to count triplets// with sum that lies in given// range [a, b].import java.util.*; class GFG{     // Function to count tripletspublic static int countTriplets(int []arr, int n,                                int a, int b){    // 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] >= a &&                    arr[i] + arr[j] + arr[k] <= b)                    {ans++;}            }        }    }     return ans;} // Driver Codepublic static void main(String[] args){    int[] arr = { 2, 7, 5, 3, 8, 4, 1, 9 };    int n = arr.length;    int a = 8, b = 16;    System.out.println("" + countTriplets(arr, n,                                        a, b));}} // This code is contributed// by Harshit Saini
# Python3 program to count# triplets with sum that# lies in given range [a, b]. # Function to count tripletsdef countTriplets(arr, n, a, b):         # 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] >= a)                and (arr[i] + arr[j] + arr[k] <= b)):                        ans += 1                             return ans # Driver codeif __name__ == "__main__":         arr = [ 2, 7, 5, 3, 8, 4, 1, 9 ]    n = len(arr)    a = 8; b = 16    print(countTriplets(arr, n, a, b)) # This code is contributed# by Harshit Saini
// C# program to count triplets// with sum that lies in given// range [a, b].using System; class GFG{     // Function to count tripletspublic static int countTriplets(int []arr, int n,                                int a, int b){    // 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] >= a &&                    arr[i] + arr[j] + arr[k] <= b)                    {ans++;}            }        }    }     return ans;} // Driver Codepublic static void Main(){    int[] arr = {2, 7, 5, 3, 8, 4, 1, 9};    int n = arr.Length;    int a = 8, b = 16;    Console.WriteLine("" + countTriplets(arr, n,                                        a, b));}} // This code is contributed// by Akanksha Rai(Abby_akku)
<?php// PHP program to count triplets with// sum that lies in given range [a, b]. // Function to count tripletsfunction countTriplets($arr, $n, $a, $b){    // Initialize result    $ans = 0;     // 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] >= $a &&                    $arr[$i] + $arr[$j] + $arr[$k] <= $b)                    $ans++;        }    }     return $ans;} // Driver Code$arr = array( 2, 7, 5, 3, 8, 4, 1, 9 );$n = sizeof($arr);$a = 8; $b = 16;echo countTriplets($arr, $n, $a, $b) . "\n"; // This code is contributed// by Akanksha Rai(Abby_akku)?>
<script>  // Javascript program to count triplets with// sum that lies in given range [a, b]. // Function to count tripletsfunction countTriplets( arr, n, a, b){    // Initialize result    var ans = 0;     // Fix the first element as A[i]    for (var i = 0; i < n - 2; i++) {         // Fix the second element as A[j]        for (var j = i + 1; j < n - 1; j++) {             // Now look for the third number            for (var k = j + 1; k < n; k++)                 if (arr[i] + arr[j] + arr[k] >= a                    && arr[i] + arr[j] + arr[k] <= b)                    ans++;        }    }     return ans;} // Driver Codevar arr = [ 2, 7, 5, 3, 8, 4, 1, 9 ];var n = arr.length;var a = 8, b = 16;document.write( countTriplets(arr, n, a, b) );  </script>
36
 
Time complexity: O(n3)Auxiliary Space: O(1) 
An efficient solution is to first find the count of triplets having a sum less than or equal to upper limit b in the range [a, b]. This count of triplets will also include triplets having a sum less than the lower limit a. Subtract the count of triplets having a sum less than a. The final result is the count of triplets having a sum in the range [a, b]. The algorithm is as follows:  
Find count of triplets having a sum less than or equal to b. Let this count be x.
Find count of triplets having a sum less than a. Let this count be y.
Final result is x-y.
To find the count of triplets having a sum less than or equal to the given value, refer Count triplets with sum smaller than a given value Below is the implementation of the above approach:  
C++
Java
Python3
C#
PHP
Javascript
// C++ program to count triplets with// sum that lies in given range [a, b].#include <bits/stdc++.h> using namespace std; // Function to find count of triplets having// sum less than or equal to val.int countTripletsLessThan(int arr[], int n, int val){    // sort the input array.    sort(arr, arr + n);     // Initialize result    int ans = 0;     int j, k;     // to store sum    int sum;     // Fix the first element    for (int 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) {            sum = arr[i] + arr[j] + arr[k];             // If sum of current triplet            // is greater, then to reduce it            // decrease k.            if (sum > val)                k--;             // If sum is less than or equal            // to given value, then add            // possible triplets (k-j) to result.            else {                ans += (k - j);                j++;            }        }    }     return ans;} // Function to return count of triplets having// sum in range [a, b].int countTriplets(int arr[], int n, int a, int b){     // to store count of triplets.    int res;     // Find count of triplets having sum less    // than or equal to b and subtract count    // of triplets having sum less than or    // equal to a-1.    res = countTripletsLessThan(arr, n, b) -        countTripletsLessThan(arr, n, a - 1);     return res;} // Driver Codeint main(){    int arr[] = { 2, 7, 5, 3, 8, 4, 1, 9 };    int n = sizeof arr / sizeof arr[0];    int a = 8, b = 16;    cout << countTriplets(arr, n, a, b) << endl;    return 0;}
// Java program to count triplets// with sum that lies in given// range [a, b].import java.util.*; class GFG{// Function to find count of// triplets having sum less// than or equal to val.public static int countTripletsLessThan(int []arr,                                        int n, int val){    // sort the input array.    Arrays.sort(arr);     // Initialize result    int ans = 0;     int j, k;     // to store sum    int sum;     // Fix the first element    for (int 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)        {            sum = arr[i] + arr[j] + arr[k];             // If sum of current triplet            // is greater, then to reduce it            // decrease k.            if (sum > val)                k--;             // If sum is less than or            // equal to given value,            // then add possible            // triplets (k-j) to result.            else            {                ans += (k - j);                j++;            }        }    }     return ans;}     // Function to return count    // of triplets having sum    // in range [a, b].    public static int countTriplets(int arr[], int n,                                    int a, int b)    {             // to store count        // of triplets.        int res;             // Find count of triplets        // having sum less than or        // equal to b and subtract        // count of triplets having        // sum less than or equal        // to a-1.        res = countTripletsLessThan(arr, n, b) -            countTripletsLessThan(arr, n, a - 1);             return res;    } // Driver Codepublic static void main(String[] args){    int[] arr = {2, 7, 5, 3,                8, 4, 1, 9};    int n = arr.length;    int a = 8, b = 16;    System.out.println("" + countTriplets(arr, n,                                        a, b));}} // This code is contributed// by Harshit Saini
# Python program to count# triplets with sum that# lies in given range [a, b]. # Function to find count of# triplets having sum less# than or equal to val.def countTripletsLessThan(arr, n, val):     # sort the input array.    arr.sort()     # Initialize result    ans = 0     j = 0; k = 0     # to store sum    sum = 0     # Fix the first element    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 :            sum = arr[i] + arr[j] + arr[k]                         # If sum of current triplet            # is greater, then to reduce it            # decrease k.            if sum > val:                k-=1             # If sum is less than or            # equal to given value,            # then add possible            # triplets (k-j) to result.            else :                ans += (k - j)                j += 1    return ans # Function to return# count of triplets having# sum in range [a, b].def countTriplets(arr, n, a, b):         # to store count of triplets.    res = 0     # Find count of triplets    # having sum less than or    # equal to b and subtract    # count of triplets having    # sum less than or equal to a-1.    res = (countTripletsLessThan(arr, n, b) -        countTripletsLessThan(arr, n, a - 1))     return res # Driver codeif __name__ == "__main__":         arr = [ 2, 7, 5, 3, 8, 4, 1, 9 ]    n = len(arr)    a = 8; b = 16    print(countTriplets(arr, n, a, b))     # This code is contributed by# Harshit Saini
// C# program to count triplets// with sum that lies in given// range [a, b].using System; class GFG{// Function to find count of// triplets having sum less// than or equal to val.public static int countTripletsLessThan(int[] arr,                                        int n, int val){    // sort the input array.    Array.Sort(arr);     // Initialize result    int ans = 0;     int j, k;     // to store sum    int sum;     // Fix the first element    for (int 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)        {            sum = arr[i] + arr[j] + arr[k];             // If sum of current triplet            // is greater, then to reduce it            // decrease k.            if (sum > val)                k--;             // If sum is less than or            // equal to given value,            // then add possible            // triplets (k-j) to result.            else            {                ans += (k - j);                j++;            }        }    }     return ans;}     // Function to return count    // of triplets having sum    // in range [a, b].    public static int countTriplets(int[] arr, int n,                                    int a, int b)    {             // to store count        // of triplets.        int res;             // Find count of triplets        // having sum less than or        // equal to b and subtract        // count of triplets having        // sum less than or equal        // to a-1.        res = countTripletsLessThan(arr, n, b) -            countTripletsLessThan(arr, n, a - 1);             return res;    } // Driver Codepublic static void Main(){    int[] arr = {2, 7, 5, 3,                8, 4, 1, 9};    int n = arr.Length;    int a = 8, b = 16;    Console.WriteLine("" + countTriplets(arr, n,                                        a, b));}} // This code is contributed// by Akanksha Rai(Abby_akku)
<?php// PHP program to count triplets with// sum that lies in given range [a, b]. // Function to find count of triplets// having sum less than or equal to val.function countTripletsLessThan($arr, $n, $val){    // sort the input array.    sort($arr);     // Initialize result    $ans = 0;     // to store sum    $sum;     // Fix the first element    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)        {            $sum = $arr[$i] + $arr[$j] + $arr[$k];             // If sum of current triplet is greater,            // then to reduce it decrease k.            if ($sum > $val)                $k--;             // If sum is less than or equal            // to given value, then add possible            // triplets (k-j) to result.            else            {                $ans += ($k - $j);                $j++;            }        }    }     return $ans;} // Function to return count of triplets// having sum in range [a, b].function countTriplets($arr, $n, $a, $b){     // to store count of triplets.    $res;     // Find count of triplets having sum less    // than or equal to b and subtract count    // of triplets having sum less than or    // equal to a-1.    $res = countTripletsLessThan($arr, $n, $b) -           countTripletsLessThan($arr, $n, $a - 1);     return $res;} // Driver Code$arr = array( 2, 7, 5, 3, 8, 4, 1, 9 );$n = sizeof($arr);$a = 8;$b = 16;echo countTriplets($arr, $n, $a, $b), "\n";     // This code is contributed by Sachin?>
<script>       // JavaScript program to count triplets      // with sum that lies in given      // range [a, b].             // Function to find count of      // triplets having sum less      // than or equal to val.      function countTripletsLessThan(arr, n, val) {        // sort the input array.        arr.sort();         // Initialize result        var ans = 0;         var j, k;         // to store sum        var sum;         // Fix the first element        for (var 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) {            sum = arr[i] + arr[j] + arr[k];             // If sum of current triplet            // is greater, then to reduce it            // decrease k.            if (sum > val) k--;            // If sum is less than or            // equal to given value,            // then add possible            // triplets (k-j) to result.            else {              ans += k - j;              j++;            }          }        }         return ans;      }       // Function to return count      // of triplets having sum      // in range [a, b].      function countTriplets(arr, n, a, b) {        // to store count        // of triplets.        var res;         // Find count of triplets        // having sum less than or        // equal to b and subtract        // count of triplets having        // sum less than or equal        // to a-1.        res =          countTripletsLessThan(arr, n, b) -          countTripletsLessThan(arr, n, a - 1);         return res;      }       // Driver Code      var arr = [2, 7, 5, 3, 8, 4, 1, 9];      var n = arr.length;      var a = 8,          b = 16;      document.write("" + countTriplets(arr, n, a, b));       </script>
36
 
Time complexity: O(n2) Auxiliary space: O(1) 
Harshit Saini
Akanksha_Rai
Sach_Code
noob2000
rdtank
pankajsharmagfg
Arrays
Sorting Quiz
STL
Algorithms
Sorting
Arrays
Sorting
STL
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
SDE SHEET - A Complete Guide for SDE Preparation
DSA Sheet by Love Babbar
Understanding Time Complexity with Simple Examples
Introduction to Algorithms
How to write a Pseudo Code?