Related Articles

# Closest product pair in an array

• Difficulty Level : Easy

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( )

Method 2 O(n Log n)

1. Sort the array
2. 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.
3. 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.

## C++

 `// Simple C++ program to find the pair with``// product closest to a given no.``#include ``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);``    ``printClosest(arr, n, x);``    ``return` `0;``}`

## Java

 `// 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.`

## Python3

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

## C#

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

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

## Javascript

 ``

Output :

`The closest pair is 2 and 5`

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

My Personal Notes arrow_drop_up