Given an array of distinct integers(considering only positive numbers) and a number ‘m’, find the number of triplets with the product equal to ‘m’.
Examples:
Input: arr[] = { 1, 4, 6, 2, 3, 8}
m = 24
Output: 3
Input: arr[] = { 0, 4, 6, 2, 3, 8}
m = 18
Output: 0
An approach with O(n) extra space has already been discussed in previous post. In this post an approach with O(1) space complexity will be discussed.
Approach: The idea is to use Three-pointer technique:
- Sort the input array.
- Fix the first element as A[i] where i is from 0 to array size – 2.
- After fixing the first element of triplet, find the other two elements using 2 pointer technique.
Below is the implementation of above approach:
C++
// C++ implementation of above approach#include <bits/stdc++.h>using namespace std;// Function to count such tripletsint countTriplets(int arr[], int n, int m){ int count = 0; // Sort the array sort(arr, arr + n); int end, start, mid; // three pointer technique for (end = n - 1; end >= 2; end--) { int start = 0, mid = end - 1; while (start < mid) { // Calculate the product of a triplet long int prod = arr[end] * arr[start] * arr[mid]; // Check if that product is greater than m, // decrement mid if (prod > m) mid--; // Check if that product is smaller than m, // increment start else if (prod < m) start++; // Check if that product is equal to m, // decrement mid, increment start and // increment the count of pairs else if (prod == m) { count++; mid--; start++; } } } return count;}// Drivers codeint main(){ int arr[] = { 1, 1, 1, 1, 1, 1 }; int n = sizeof(arr) / sizeof(arr[0]); int m = 1; cout << countTriplets(arr, n, m); return 0;} |
Java
// Java implementation of // above approachimport java.io.*;import java.util.*;class GFG {// Function to count such tripletsstatic int countTriplets(int arr[], int n, int m){ int count = 0; // Sort the array Arrays.sort(arr); int end, start, mid; // three pointer technique for (end = n - 1; end >= 2; end--) { start = 0; mid = end - 1; while (start < mid) { // Calculate the product // of a triplet long prod = arr[end] * arr[start] * arr[mid]; // Check if that product // is greater than m, // decrement mid if (prod > m) mid--; // Check if that product // is smaller than m, // increment start else if (prod < m) start++; // Check if that product is equal // to m, decrement mid, increment // start and increment the // count of pairs else if (prod == m) { count++; mid--; start++; } } } return count;}// Driver codepublic static void main (String[] args) { int []arr = { 1, 1, 1, 1, 1, 1 }; int n = arr.length; int m = 1; System.out.println(countTriplets(arr, n, m));}}// This code is contributed // by inder_verma. |
Python3
# Python3 implementation # of above approach# Function to count such tripletsdef countTriplets(arr, n, m): count = 0 # Sort the array arr.sort() # three pointer technique for end in range(n - 1, 1, -1) : start = 0 mid = end - 1 while (start < mid) : # Calculate the product # of a triplet prod = (arr[end] * arr[start] * arr[mid]) # Check if that product is # greater than m, decrement mid if (prod > m): mid -= 1 # Check if that product is # smaller than m, increment start elif (prod < m): start += 1 # Check if that product is equal # to m, decrement mid, increment # start and increment the count # of pairs elif (prod == m): count += 1 mid -= 1 start += 1 return count# Drivers codeif __name__ == "__main__": arr = [ 1, 1, 1, 1, 1, 1 ] n = len(arr) m = 1 print(countTriplets(arr, n, m))# This code is contributed # by ChitraNayal |
C#
// C# implementation of above approachusing System;class GFG {// Function to count such tripletsstatic int countTriplets(int []arr, int n, int m){ int count = 0; // Sort the array Array.Sort(arr); int end, start, mid; // three pointer technique for (end = n - 1; end >= 2; end--) { start = 0; mid = end - 1; while (start < mid) { // Calculate the product // of a triplet long prod = arr[end] * arr[start] * arr[mid]; // Check if that product // is greater than m, // decrement mid if (prod > m) mid--; // Check if that product // is smaller than m, // increment start else if (prod < m) start++; // Check if that product // is equal to m, // decrement mid, increment // start and increment the // count of pairs else if (prod == m) { count++; mid--; start++; } } } return count;}// Driver codepublic static void Main (String []args) { int []arr = { 1, 1, 1, 1, 1, 1 }; int n = arr.Length; int m = 1; Console.WriteLine(countTriplets(arr, n, m));}}// This code is contributed// by Arnab Kundu |
PHP
<?php// PHP implementation of above approach // Function to count such triplets function countTriplets($arr, $n, $m) { $count = 0; // Sort the array sort($arr); $end; $start; $mid; // three pointer technique for ($end = $n - 1; $end >= 2; $end--) { $start = 0; $mid = $end - 1; while ($start < $mid) { // Calculate the product of a triplet $prod = $arr[$end] * $arr[$start] * $arr[$mid]; // Check if that product is greater than m, // decrement mid if ($prod > $m) $mid--; // Check if that product is smaller than m, // increment start else if ($prod < $m) $start++; // Check if that product is equal to m, // decrement mid, increment start and // increment the count of pairs else if ($prod == $m) { $count++; $mid--; $start++; } } } return $count; } // Drivers code $arr = array( 1, 1, 1, 1, 1, 1 ); $n = sizeof($arr) / sizeof($arr[0]); $m = 1; echo countTriplets($arr, $n, $m); #This Code is Contributed by ajit?> |
Javascript
<script> // Javascript implementation of above approach // Function to count such triplets function countTriplets(arr, n, m) { let count = 0; // Sort the array arr.sort(function(a, b){return a - b}); let end, start, mid; // three pointer technique for (end = n - 1; end >= 2; end--) { start = 0; mid = end - 1; while (start < mid) { // Calculate the product // of a triplet let prod = arr[end] * arr[start] * arr[mid]; // Check if that product // is greater than m, // decrement mid if (prod > m) mid--; // Check if that product // is smaller than m, // increment start else if (prod < m) start++; // Check if that product // is equal to m, // decrement mid, increment // start and increment the // count of pairs else if (prod == m) { count++; mid--; start++; } } } return count; } let arr = [ 1, 1, 1, 1, 1, 1 ]; let n = arr.length; let m = 1; document.write(countTriplets(arr, n, m));</script> |
6
Complexity Analysis:
- Time complexity: O(N^2)
- Space Complexity: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
