Given an array of non-negative integers and a number x, find a pair in the array whose product is closest to x.
Examples:
Input : arr[] = [2, 3, 5, 9] x = 47 Output : {5, 9} Input : arr[] = [2, 3, 5, 9] x = 8 Output : {2, 5}
Method 1
A simple solution is to consider every pair and keep track of the closest pair (absolute difference between pair product and x is minimum). Finally, print the closest pair. The time complexity of this solution is O(
Implementation:-
// Simple C++ program to find the pair with // product closest to a given no. #include <bits/stdc++.h> using namespace std;
// Prints the pair with product closest to x void printClosest( int arr[], int n, int x)
{ // pair to store answer pair
pair< int , int > ans;
// temp to store the minimum current difference
int temp = INT_MAX;
// iterating over array
for ( int i = 0; i < n - 1; i++) {
for ( int j = i + 1; j < n; j++) {
// checking for minimum difference
if ( abs (arr[i] * arr[j] - x) <= temp) {
ans.first = arr[i];
ans.second = arr[j];
temp = abs (arr[i] * arr[j] - x);
}
}
}
cout << ans.first << " " << ans.second;
} // Driver program to test above functions int main()
{ int arr[] = { 2, 3, 5, 9 }, x = 8;
int n = sizeof (arr) / sizeof (arr[0]);
printClosest(arr, n, x);
return 0;
} // This code is contributed by shubhamrajput6156 |
// Java program to find the pair with product closest to a // given number public class Main {
// Prints the pair with product closest to x
public static void printClosest( int [] arr, int n, int x)
{
int closestFirst = 0 , closestSecond = 0 ;
int temp = Integer.MAX_VALUE;
// iterating over array
for ( int i = 0 ; i < n - 1 ; i++) {
for ( int j = i + 1 ; j < n; j++) {
// checking for minimum difference
if (Math.abs(arr[i] * arr[j] - x) <= temp) {
closestFirst = arr[i];
closestSecond = arr[j];
temp = Math.abs(arr[i] * arr[j] - x);
}
}
}
System.out.println(closestFirst + " "
+ closestSecond);
}
// Driver program
public static void main(String[] args)
{
int [] arr = { 2 , 3 , 5 , 9 };
int x = 8 ;
int n = arr.length;
printClosest(arr, n, x);
}
} |
# Simple Python3 program to find # the pair with product closest # to a given no. # Prints the pair with product closest to x def printClosest(arr: list , n: int , x: int ):
# To store indexes
# of result pair
ans_a, ans_b = 0 , 0
# temp to store the minimum current difference
temp = float ( "inf" )
for i in range (n - 1 ):
for j in range (i + 1 , n):
# checking for minimum difference
if abs (arr[i] * arr[j] - x) < = temp:
ans_a, ans_b = arr[i], arr[j]
temp = abs (arr[i] * arr[j] - x)
print (ans_a, ans_b)
# driver code arr = [ 2 , 3 , 5 , 9 ]
x = 8
n = len (arr)
printClosest(arr, n, x) # This code is contributed by redmoonz. |
using System;
namespace ClosestPair
{ class Program
{
// Function to find the pair with product closest to x
static void PrintClosest( int [] arr, int n, int x)
{
int closestFirst = 0, closestSecond = 0;
int temp = int .MaxValue;
// iterating over array
for ( int i = 0; i < n - 1; i++)
{
for ( int j = i + 1; j < n; j++)
{
// checking for minimum difference
if (Math.Abs(arr[i] * arr[j] - x) <= temp)
{
closestFirst = arr[i];
closestSecond = arr[j];
temp = Math.Abs(arr[i] * arr[j] - x);
}
}
}
Console.WriteLine(closestFirst + " " + closestSecond);
}
static void Main( string [] args)
{
int [] arr = { 2, 3, 5, 9 };
int x = 8;
int n = arr.Length;
PrintClosest(arr, n, x);
}
}
} |
<script> // javascript program to find the pair with // product closest to a given no. // Prints the pair with product closest to x function printClosest(arr, n, x){
// temp to store the minimum current difference
var temp = 1e9;
var a, b;
// iterating over array
for (let i = 0; i < n - 1; i++) {
for (let j = i + 1; j < n; j++) {
// checking for minimum difference
if (Math.abs(arr[i] * arr[j] - x) <= temp) {
a= arr[i];
b=arr[j];
temp = Math.abs(arr[i] * arr[j] - x);
}
}
}
console.log(a , b);
} const arr=[2, 3, 5, 9];
const n = arr.length;
const x =8;
printClosest(arr, n, x);
//this code is contributed by bhardwajji
<script> |
Output
2 5
Time Complexity:- O(N^2)
Auxiliary Space:- O(1)
Method 2: O(n Log n)
- Sort the array
- Initialize a variable diff as infinite (Diff is used to store the difference between a pair and x). We need to find the minimum diff.
- Traverse the array and for each i, do the following :
- Find the lower bound for x/arr[i] in the sub-array on the right of arr[i], i.e., in subarray arr[i+1..n-1]. Let it be denoted by l.
- Find the upper bound for x/arr[i] in the sub array on the right of arr[i], i.e., in sub array arr[i+1..n-1]. Let it be denoted by u.
- If min(abs((arr[i] * l) – x), abs((arr[i] * u) – x)) < diff, then update diff and result
Method 3 O(n for sorted)
An efficient solution can find the pair in O(n) time. The following is the detailed algorithm.
1) Initialize a variable diff as infinite (Diff is used to store the difference between pair and x). We need to find the minimum diff. 2) Initialize two index variables l and r in the given sorted array. (a) Initialize first to the leftmost index: l = 0 (b) Initialize second the rightmost index: r = n-1 3) Loop while l < r. (a) If abs((arr[l] * arr[r]) - x) < diff then update diff and result (b) Else if((arr[l] * arr[r]) < x) then l++ (c) Else r--
The following is the implementation of the above algorithm.
// Simple C++ program to find the pair with // product closest to a given no. #include <bits/stdc++.h> using namespace std;
// Prints the pair with product closest to x void printClosest( int arr[], int n, int x)
{ int res_l, res_r; // To store indexes of result pair
// Initialize left and right indexes and
// difference between pair product and x
int l = 0, r = n - 1, diff = INT_MAX;
// While there are elements between l and r
while (r > l) {
// Check if this pair is closer than
// the closest pair so far
if ( abs (arr[l] * arr[r] - x) < diff) {
res_l = l;
res_r = r;
diff = abs (arr[l] * arr[r] - x);
}
// If this pair has more product,
// move to smaller values.
if (arr[l] * arr[r] > x)
r--;
else // Move to larger values
l++;
}
cout << " The closest pair is "
<< arr[res_l] << " and " << arr[res_r];
} // Driver program to test above functions int main()
{ int arr[] = { 2, 3, 5, 9 }, x = 8;
int n = sizeof (arr) / sizeof (arr[0]);
printClosest(arr, n, x);
return 0;
} |
// Simple Java program to find // the pair with product closest // to a given no. import java.io.*;
class GFG
{ // Prints the pair with // product closest to x static void printClosest( int arr[],
int n, int x)
{ // To store indexes of result pair
int res_l = 0 , res_r = 0 ;
// Initialize left and right
// indexes and difference
// between pair product and x
int l = 0 , r = n - 1 , diff = Integer.MAX_VALUE;
// While there are
// elements between l and r
while (r > l)
{
// Check if this pair is closer
// than the closest pair so far
if (Math.abs(arr[l] * arr[r] - x) < diff)
{
res_l = l;
res_r = r;
diff = Math.abs(arr[l] * arr[r] - x);
}
// If this pair has more product,
// move to smaller values.
if (arr[l] * arr[r] > x)
r--;
// Move to larger values
else l++;
}
System.out.print( "The closest pair is " );
System.out.print (arr[res_l] +
" and " +
arr[res_r]);
} // Driver Code public static void main (String[] args)
{ int arr[] = { 2 , 3 , 5 , 9 };
int x = 8 ;
int n = arr.length;
printClosest(arr, n, x); } } // This code is contributed by anuj_67. |
# Simple Python3 program to find # the pair with product closest # to a given no. import sys
# Prints the pair with # product closest to x def printClosest(arr, n, x):
# To store indexes
# of result pair
res_l = 0 ;
res_r = 0 ;
# Initialize left and right
# indexes and difference
# between pair product and x
l = 0 ;
r = n - 1 ;
diff = sys.maxsize;
# While there are elements
# between l and r
while (r > l):
# Check if this pair is
# closer than the closest
# pair so far
if ( abs (arr[l] * arr[r] - x) < diff):
res_l = l;
res_r = r;
diff = abs (arr[l] * arr[r] - x);
# If this pair has more
# product, move to smaller
# values.
if (arr[l] * arr[r] > x):
r = r - 1 ;
# Move to larger values
else :
l = l + 1 ;
print ( "The closest pair is" , arr[res_l] ,
"and" , arr[res_r]);
# Driver Code arr = [ 2 , 3 , 5 , 9 ];
x = 8 ;
n = len (arr);
printClosest(arr, n, x); # This code is contributed # by rahul |
// Simple C# program to find // the pair with product closest // to a given no. using System;
class GFG
{ // Prints the pair with // product closest to x static void printClosest( int []arr,
int n, int x)
{ // To store indexes of result pair
int res_l = 0, res_r = 0;
// Initialize left and right
// indexes and difference
// between pair product and x
int l = 0, r = n - 1,
diff = int .MaxValue;
// While there are
// elements between l and r
while (r > l)
{
// Check if this pair is closer
// than the closest pair so far
if (Math.Abs(arr[l] *
arr[r] - x) < diff)
{
res_l = l;
res_r = r;
diff = Math.Abs(arr[l] *
arr[r] - x);
}
// If this pair has more product,
// move to smaller values.
if (arr[l] * arr[r] > x)
r--;
// Move to larger values
else
l++;
}
Console.Write( "The closest pair is " );
Console.Write (arr[res_l] +
" and " +
arr[res_r]);
} // Driver Code public static void Main ()
{ int []arr = {2, 3, 5, 9};
int x = 8;
int n = arr.Length;
printClosest(arr, n, x); } } // This code is contributed by anuj_67. |
<?php // Simple PHP program to find // the pair with product closest // to a given no. // Prints the pair with // product closest to x function printClosest( $arr , $n , $x )
{ // To store indexes
// of result pair
$res_l ; $res_r ;
// Initialize left and right
// indexes and difference
// between pair product and x
$l = 0; $r = $n - 1; $diff = PHP_INT_MAX;
// While there are elements
// between l and r
while ( $r > $l )
{
// Check if this pair is
// closer than the closest
// pair so far
if ( abs ( $arr [ $l ] *
$arr [ $r ] - $x ) < $diff )
{
$res_l = $l ;
$res_r = $r ;
$diff = abs ( $arr [ $l ] *
$arr [ $r ] - $x );
}
// If this pair has more
// product, move to smaller
// values.
if ( $arr [ $l ] * $arr [ $r ] > $x )
$r --;
// Move to larger values
else $l ++;
}
echo " The closest pair is " ,
$arr [ $res_l ] , " and " ,
$arr [ $res_r ];
} // Driver Code $arr = array (2, 3, 5, 9);
$x = 8;
$n = count ( $arr );
printClosest( $arr , $n , $x );
// This code is contributed by anuj_67. ?> |
<script> // Simple Javascript program to find the pair with // product closest to a given no. // Prints the pair with product closest to x function printClosest(arr, n, x)
{ var res_l, res_r; // To store indexes of result pair
// Initialize left and right indexes and
// difference between pair product and x
var l = 0, r = n - 1, diff = 10000000000;
// While there are elements between l and r
while (r > l) {
// Check if this pair is closer than
// the closest pair so far
if (Math.abs(arr[l] * arr[r] - x) < diff) {
res_l = l;
res_r = r;
diff = Math.abs(arr[l] * arr[r] - x);
}
// If this pair has more product,
// move to smaller values.
if (arr[l] * arr[r] > x)
r--;
else // Move to larger values
l++;
}
document.write( " The closest pair is "
+ arr[res_l] + " and " + arr[res_r]);
} // Driver program to test above functions var arr = [2, 3, 5, 9 ], x = 8;
var n = arr.length;
printClosest(arr, n, x); </script> |
Output
The closest pair is 2 and 5