Count pairs in a sorted array whose product is less than k
Last Updated :
05 Apr, 2023
Given a sorted integer array and number k, the task is to count pairs in an array whose product is less than x.
Examples:
Input: A = {2, 3, 5, 6}, k = 16
Output: 4
Pairs having product less than 16: (2, 3), (2, 5), (2, 6), (3, 5)
Input: A = {2, 3, 4, 6, 9}, k = 20
Output: 6
Pairs having product less than 20: (2, 3), (2, 4), (2, 6), (2, 9), (3, 4), (3, 6)
A simple solution of this problem run two loops to generate all pairs and one by one and check if current pair’s product is less than x or not.
An Efficient solution of this problem is take initial and last value of index in l and r variable. Consider below two cases:
- Case-I:
- Lets consider i < j and A[i]*A[j] < k then we can say that A[i]*A[j-1] < k as A[j-1] < A[j] for a sorted array,
- Similarly A[i]*A[j-2] < k, A[i]*A[j-3] < k, ….., A[i]*A[i+1] < k.
- Case-II:
- Lets consider i k then we can say that A[i]*A[j+1] > k as A[j+1] > A[j] for a sorted array,
- similarly A[i]*A[j+2] > k, A[i]*A[j+3] > k, ….., A[i]*A[n-1] > k.
Above problem is similar to Count pairs in a sorted array whose sum is less than x, the only thing that is different is to find the product of pairs instead of sum.
Below is the algorithm to solve this problem:
1) Initialize two variables l and r to find the candidate
elements in the sorted array.
(a) l = 0
(b) r = n - 1
2) Initialize : result = 0
2) Loop while l < r.
// If current left and current
// right have product smaller than x,
// the all elements from l+1 to r
// form a pair with current
(a) If (arr[l] * arr[r] < x)
result = result + (r - l)
l++;
(b) Else
r--;
3) Return result
Below is the implementation of the above algorithm:
C++
#include <bits/stdc++.h>
using namespace std;
int fun( int A[], int n, int k)
{
int count = 0;
int i = 0;
int j = n - 1;
while (i < j) {
if (A[i] * A[j] < k) {
count += (j - i);
i++;
}
else {
j--;
}
}
return count;
}
int main()
{
int A[] = { 2, 3, 4, 6, 9 };
int n = sizeof (A) / sizeof ( int );
int k = 20;
cout << "Number of pairs with product less than "
<< k << " = " << fun(A, n, k) << endl;
return 0;
}
|
Java
class GFG
{
static int fun( int A[],
int n, int k)
{
int count = 0 ;
int i = 0 ;
int j = n - 1 ;
while (i < j)
{
if (A[i] * A[j] < k)
{
count += (j - i);
i++;
}
else
{
j--;
}
}
return count;
}
public static void main(String args[])
{
int A[] = { 2 , 3 , 4 , 6 , 9 };
int n = A.length;
int k = 20 ;
System.out.println( "Number of pairs with " +
"product less than 20 = " +
fun(A, n, k));
}
}
|
Python
def fun(A, k):
count = 0
n = len (A)
i = 0
j = n - 1
while i < j:
if A[i] * A[j] < k:
count + = (j - i)
i + = 1
else :
j - = 1
return count
A = [ 2 , 3 , 4 , 6 , 9 ]
k = 20
print ( "Number of pairs with product less than " ,
k, " = " , fun(A, k))
|
C#
using System;
class GFG
{
static int fun( int []A,
int n, int k)
{
int count = 0;
int i = 0;
int j = n - 1;
while (i < j)
{
if (A[i] * A[j] < k)
{
count += (j - i);
i++;
}
else
{
j--;
}
}
return count;
}
public static void Main()
{
int []A = {2, 3, 4, 6, 9};
int n = A.Length;
int k = 20;
Console.WriteLine( "Number of pairs with " +
"product less than 20 = " +
fun(A, n, k));
}
}
|
PHP
<?php
function fun( $A , $n , $k )
{
$count = 0;
$i = 0;
$j = ( $n - 1);
while ( $i < $j )
{
if ( $A [ $i ] * $A [ $j ] < $k )
{
$count += ( $j - $i );
$i ++;
}
else
{
$j --;
}
}
return $count ;
}
$A = array ( 2, 3, 4, 6, 9 );
$n = sizeof( $A );
$k = 20;
echo "Number of pairs with product less than " ,
$k , " = " , fun( $A , $n , $k ) , "\n" ;
?>
|
Javascript
<script>
function fun(A, n, k)
{
let count = 0;
let i = 0;
let j = n - 1;
while (i < j)
{
if (A[i] * A[j] < k)
{
count += (j - i);
i++;
}
else
{
j--;
}
}
return count;
}
let A = [2, 3, 4, 6, 9];
let n = A.length;
let k = 20;
document.write( "Number of pairs with " +
"product less than 20 = " +
fun(A, n, k));
</script>
|
Output
Number of pairs with product less than 20 = 6
Complexity Analysis:
- Time Complexity: O(N), where N is the size of the given array.
- Auxiliary Space: O(1), no extra space is required, so it is a constant.
Approach 2: Binary Search:
This problem can be solved using binary search. We can fix one element of the pair and then use binary search to find the maximum index of the second element such that their product is less than k. We can repeat this process for all elements of the array and sum up the counts to get the total number of pairs with product less than k.
In this code, we use a nested loop to traverse the array and fix one element of the pair. We then use binary search to find the maximum index of the second element such that their product is less than k. We count the number of pairs for each fixed element and sum up the counts to get the total number of pairs with product less than k.
Here is the code to solve this problem using binary search in C++:
C++
#include <bits/stdc++.h>
using namespace std;
int fun( int A[], int n, int k)
{
int count = 0;
for ( int i = 0; i < n; i++) {
int lo = i + 1;
int hi = n - 1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (A[i] * A[mid] < k) {
count += (mid - lo + 1);
lo = mid + 1;
}
else {
hi = mid - 1;
}
}
}
return count;
}
int main()
{
int A[] = { 2, 3, 4, 6, 9 };
int n = sizeof (A) / sizeof ( int );
int k = 20;
cout << "Number of pairs with product less than " << k
<< " = " << fun(A, n, k) << endl;
return 0;
}
|
Java
import java.util.*;
public class Main {
public static int fun( int [] A, int n, int k)
{
int count = 0 ;
for ( int i = 0 ; i < n; i++) {
int lo = i + 1 ;
int hi = n - 1 ;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2 ;
if (A[i] * A[mid] < k) {
count += (mid - lo + 1 );
lo = mid + 1 ;
}
else {
hi = mid - 1 ;
}
}
}
return count;
}
public static void main(String[] args)
{
int [] A = { 2 , 3 , 4 , 6 , 9 };
int n = A.length;
int k = 20 ;
System.out.println(
"Number of pairs with product less than " + k
+ " = " + fun(A, n, k));
}
}
|
Python3
def fun(A, n, k):
count = 0
for i in range (n):
lo = i + 1
hi = n - 1
while lo < = hi:
mid = lo + (hi - lo) / / 2
if A[i] * A[mid] < k:
count + = (mid - lo + 1 )
lo = mid + 1
else :
hi = mid - 1
return count
A = [ 2 , 3 , 4 , 6 , 9 ]
n = len (A)
k = 20
print ( "Number of pairs with product less than" , k, "=" , fun(A, n, k))
|
C#
using System;
using System.Collections.Generic;
public class MainClass {
public static int Fun( int [] A, int n, int k)
{
int count = 0;
for ( int i = 0; i < n; i++) {
int lo = i + 1;
int hi = n - 1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (A[i] * A[mid] < k) {
count += (mid - lo + 1);
lo = mid + 1;
}
else {
hi = mid - 1;
}
}
}
return count;
}
public static void Main()
{
int [] A = { 2, 3, 4, 6, 9 };
int n = A.Length;
int k = 20;
Console.WriteLine(
"Number of pairs with product less than " + k
+ " = " + Fun(A, n, k));
}
}
|
Javascript
function fun(A, n, k) {
let count = 0;
for (let i = 0; i < n; i++) {
let lo = i + 1;
let hi = n - 1;
while (lo <= hi) {
let mid = lo + Math.floor((hi - lo) / 2);
if (A[i] * A[mid] < k) {
count += (mid - lo + 1);
lo = mid + 1;
}
else {
hi = mid - 1;
}
}
}
return count;
}
let A = [2, 3, 4, 6, 9];
let n = A.length;
let k = 20;
console.log(`Number of pairs with product less than ${k} = ${fun(A, n, k)}`);
|
Output
Number of pairs with product less than 20 = 6
Complexity Analysis:
Time Complexity: O(NLogN), where N is the size of the given array.
Auxiliary Space: O(1), no extra space is required, so it is a constant.
Share your thoughts in the comments
Please Login to comment...