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

My Personal Notes arrow_drop_up