Open in App
Not now

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

• Difficulty Level : Medium
• Last Updated : 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++

 `// C++ program to count triplets with` `// sum that lies in given range [a, b].` `#include `   `using` `namespace` `std;`   `// Function to count triplets` `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 Code` `int` `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

 `// Java program to count triplets ` `// with sum that lies in given ` `// range [a, b].` `import` `java.util.*;`   `class` `GFG` `{` `    `  `// Function to count triplets` `public` `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 Code` `public` `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

 `# Python3 program to count ` `# triplets with sum that ` `# lies in given range [a, b].`   `# Function to count triplets` `def` `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 code` `if` `__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#

 `// C# program to count triplets ` `// with sum that lies in given ` `// range [a, b].` `using` `System;`   `class` `GFG` `{` `    `  `// Function to count triplets` `public` `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 Code` `public` `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

 `= ``\$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)` `?>`

Javascript

 ``

Output:

`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++

 `// C++ program to count triplets with` `// sum that lies in given range [a, b].` `#include `   `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 Code` `int` `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

 `// 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 Code` `public` `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

 `# 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 code` `if` `__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#

 `// 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 Code` `public` `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

 ` ``\$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` `?>`

Javascript

 ``

Output:

`36`

Time complexity: O(n2
Auxiliary space: O(1)

My Personal Notes arrow_drop_up
Related Articles