Given three array A[], B[] and C[] of N integers each. The task is to find the count of triplets (A[i], B[j], C[k]) such that A[i] < B[j] < C[k].
Input: A[] = {1, 5}, B[] = {2, 4}, C[] = {3, 6}
Output: 3
Triplets are (1, 2, 3), (1, 4, 6) and (1, 2, 6)
Input: A[] = {1, 1, 1}, B[] = {2, 2, 2}, C[] = {3, 3, 3}
Output: 27
Approach: Sort all the given arrays. Now fix an element say X in array B[] and for each X, the answer will be the product of the count of elements in array A[] which are less than X and the count of elements in array C[] which are greater than X. We can compute both of these counts using modified binary search.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // Function to return the count // of elements in arr[] which are // less than the given key int countLessThan( int arr[], int n, int key) { int l = 0, r = n - 1; int index = -1; // Modified binary search while (l <= r) { int m = (l + r) / 2; if (arr[m] < key) { l = m + 1; index = m; } else { r = m - 1; } } return (index + 1); } // Function to return the count // of elements in arr[] which are // greater than the given key int countGreaterThan( int arr[], int n, int key) { int l = 0, r = n - 1; int index = -1; // Modified binary search while (l <= r) { int m = (l + r) / 2; if (arr[m] <= key) { l = m + 1; } else { r = m - 1; index = m; } } if (index == -1) return 0; return (n - index); } // Function to return the count // of the required triplets int countTriplets( int n, int * a, int * b, int * c) { // Sort all three arrays sort(a, a + n); sort(b, b + n); sort(c, c + n); int count = 0; // Iterate for all the elements of array B for ( int i = 0; i < n; ++i) { int current = b[i]; int a_index = -1, c_index = -1; // Count of elements in A[] // which are less than the // chosen element from B[] int low = countLessThan(a, n, current); // Count of elements in C[] // which are greater than the // chosen element from B[] int high = countGreaterThan(c, n, current); // Update the count count += (low * high); } return count; } // Driver code int main() { int a[] = { 1, 5 }; int b[] = { 2, 4 }; int c[] = { 3, 6 }; int size = sizeof (a) / sizeof (a[0]); cout << countTriplets(size, a, b, c); return 0; } |
Java
// Java implementation of the approach import java.util.*; class GFG { // Function to return the count // of elements in arr[] which are // less than the given key static int countLessThan( int arr[], int n, int key) { int l = 0 , r = n - 1 ; int index = - 1 ; // Modified binary search while (l <= r) { int m = (l + r) / 2 ; if (arr[m] < key) { l = m + 1 ; index = m; } else { r = m - 1 ; } } return (index + 1 ); } // Function to return the count // of elements in arr[] which are // greater than the given key static int countGreaterThan( int arr[], int n, int key) { int l = 0 , r = n - 1 ; int index = - 1 ; // Modified binary search while (l <= r) { int m = (l + r) / 2 ; if (arr[m] <= key) { l = m + 1 ; } else { r = m - 1 ; index = m; } } if (index == - 1 ) return 0 ; return (n - index); } // Function to return the count // of the required triplets static int countTriplets( int n, int a[], int b[], int c[]) { // Sort all three arrays Arrays.sort(a) ; Arrays.sort(b); Arrays.sort(c); int count = 0 ; // Iterate for all the elements of array B for ( int i = 0 ; i < n; ++i) { int current = b[i]; // Count of elements in A[] // which are less than the // chosen element from B[] int low = countLessThan(a, n, current); // Count of elements in C[] // which are greater than the // chosen element from B[] int high = countGreaterThan(c, n, current); // Update the count count += (low * high); } return count; } // Driver code public static void main(String args[]) { int a[] = { 1 , 5 }; int b[] = { 2 , 4 }; int c[] = { 3 , 6 }; int size = a.length; System.out.println(countTriplets(size, a, b, c)); } } // This code is contributed by Arnab Kundu |
Python 3
# Python 3 implementation of the approach # Function to return the count # of elements in arr[] which are # less than the given key def countLessThan(arr, n, key): l = 0 r = n - 1 index = - 1 # Modified binary search while (l < = r): m = (l + r) / / 2 if (arr[m] < key) : l = m + 1 index = m else : r = m - 1 return (index + 1 ) # Function to return the count # of elements in arr[] which are # greater than the given key def countGreaterThan(arr, n, key): l = 0 r = n - 1 index = - 1 # Modified binary search while (l < = r) : m = (l + r) / / 2 if (arr[m] < = key) : l = m + 1 else : r = m - 1 index = m if (index = = - 1 ): return 0 return (n - index) # Function to return the count # of the required triplets def countTriplets(n, a, b, c): # Sort all three arrays a.sort b.sort() c.sort() count = 0 # Iterate for all the elements of array B for i in range (n): current = b[i] a_index = - 1 c_index = - 1 # Count of elements in A[] # which are less than the # chosen element from B[] low = countLessThan(a, n, current) # Count of elements in C[] # which are greater than the # chosen element from B[] high = countGreaterThan(c, n, current) # Update the count count + = (low * high) return count # Driver code if __name__ = = "__main__" : a = [ 1 , 5 ] b = [ 2 , 4 ] c = [ 3 , 6 ] size = len (a) print ( countTriplets(size, a, b, c)) # This code is contributed by ChitraNayal |
C#
// C# implementation of the approach using System; class GFG { // Function to return the count // of elements in arr[] which are // less than the given key static int countLessThan( int []arr, int n, int key) { int l = 0, r = n - 1; int index = -1; // Modified binary search while (l <= r) { int m = (l + r) / 2; if (arr[m] < key) { l = m + 1; index = m; } else { r = m - 1; } } return (index + 1); } // Function to return the count // of elements in arr[] which are // greater than the given key static int countGreaterThan( int []arr, int n, int key) { int l = 0, r = n - 1; int index = -1; // Modified binary search while (l <= r) { int m = (l + r) / 2; if (arr[m] <= key) { l = m + 1; } else { r = m - 1; index = m; } } if (index == -1) return 0; return (n - index); } // Function to return the count // of the required triplets static int countTriplets( int n, int []a, int []b, int []c) { // Sort all three arrays Array.Sort(a) ; Array.Sort(b); Array.Sort(c); int count = 0; // Iterate for all the elements of array B for ( int i = 0; i < n; ++i) { int current = b[i]; // Count of elements in A[] // which are less than the // chosen element from B[] int low = countLessThan(a, n, current); // Count of elements in C[] // which are greater than the // chosen element from B[] int high = countGreaterThan(c, n, current); // Update the count count += (low * high); } return count; } // Driver code public static void Main() { int []a = { 1, 5 }; int []b = { 2, 4 }; int []c = { 3, 6 }; int size = a.Length; Console.WriteLine(countTriplets(size, a, b, c)); } } // This code is contributed by AnkitRai01 |
PHP
<?php // PHP implementation of the approach // Function to return the count // of elements in arr[] which are // less than the given key function countLessThan(& $arr , $n , $key ) { $l = 0; $r = $n - 1; $index = -1; // Modified binary search while ( $l <= $r ) { $m = intval (( $l + $r ) / 2); if ( $arr [ $m ] < $key ) { $l = $m + 1; $index = $m ; } else { $r = $m - 1; } } return ( $index + 1); } // Function to return the count // of elements in arr[] which are // greater than the given key function countGreaterThan(& $arr , $n , $key ) { $l = 0; $r = $n - 1; $index = -1; // Modified binary search while ( $l <= $r ) { $m = intval (( $l + $r ) / 2); if ( $arr [ $m ] <= $key ) { $l = $m + 1; } else { $r = $m - 1; $index = $m ; } } if ( $index == -1) return 0; return ( $n - $index ); } // Function to return the count // of the required triplets function countTriplets( $n , & $a , & $b , & $c ) { // Sort all three arrays sort( $a ); sort( $b ); sort( $c ); $count = 0; // Iterate for all the elements of array B for ( $i = 0; $i < $n ; ++ $i ) { $current = $b [ $i ]; $a_index = -1; $c_index = -1; // Count of elements in A[] // which are less than the // chosen element from B[] $low = countLessThan( $a , $n , $current ); // Count of elements in C[] // which are greater than the // chosen element from B[] $high = countGreaterThan( $c , $n , $current ); // Update the count $count += ( $low * $high ); } return $count ; } // Driver code $a = array ( 1, 5 ); $b = array ( 2, 4 ); $c = array ( 3, 6 ); $size = sizeof( $a ); echo countTriplets( $size , $a , $b , $c ); // This code is contributed by ChitraNayal ?> |
Javascript
<script> // JavaScript implementation of the approach // Function to return the count // of elements in arr[] which are // less than the given key function countLessThan(arr,n,key) { let l = 0, r = n - 1; let index = -1; // Modified binary search while (l <= r) { let m = Math.floor((l + r) / 2); if (arr[m] < key) { l = m + 1; index = m; } else { r = m - 1; } } return (index + 1); } // Function to return the count // of elements in arr[] which are // greater than the given key function countGreaterThan(arr,n,key) { let l = 0, r = n - 1; let index = -1; // Modified binary search while (l <= r) { let m = Math.floor((l + r) / 2); if (arr[m] <= key) { l = m + 1; } else { r = m - 1; index = m; } } if (index == -1) return 0; return (n - index); } // Function to return the count // of the required triplets function countTriplets(n,a,b,c) { // Sort all three arrays a.sort( function (e,f){ return e-f;}) ; b.sort( function (e,f){ return e-f;}) ; c.sort( function (e,f){ return e-f;}) ; let count = 0; // Iterate for all the elements of array B for (let i = 0; i < n; ++i) { let current = b[i]; // Count of elements in A[] // which are less than the // chosen element from B[] let low = countLessThan(a, n, current); // Count of elements in C[] // which are greater than the // chosen element from B[] let high = countGreaterThan(c, n, current); // Update the count count += (low * high); } return count; } // Driver code let a=[1, 5 ]; let b=[2, 4]; let c=[3, 6 ]; let size = a.length; document.write(countTriplets(size, a, b, c)); // This code is contributed by avanitrachhadiya2155 </script> |
3
Time Complexity: O(nlog(n))
Auxiliary Space: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!