If you want to practice data structure and algorithm programs, you can go through data structure and algorithm interview questions.

### Problem :

**For example:**

1 2 3 4 |
array[]={-40,-5,1,3,6,7,8,20}; The pair whose sum is closest to 5 : 1 and 3 |

### Solution :

#### Solution 1:

You can check each and every pair of numbers and find the sum close to X.

**Java code:**

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public static void findPairWithClosestToXBruteForce(int arr[],int X) { if(arr.length<2) return; // Suppose 1st two element has minimum diff with X int minimumDiff=Math.abs(arr[0]+arr[1]-X); int pair1stIndex=0; int pair2ndIndex=1; for (int i = 0; i < arr.length; i++) { for (int j = i+1; j < arr.length; j++) { int tempDiff=Math.abs(arr[i]+arr[j]-X); if(tempDiff< minimumDiff) { pair1stIndex=i; pair2ndIndex=j; minimumDiff=tempDiff; } } } System.out.println(" The pair whose sum is closest to X using brute force method: "+arr[pair1stIndex]+" "+ arr[pair2ndIndex]); } |

#### Solution 2:

- We will maintain two indexes one at beginning (l=0) and one at end (r=n-1)
- iterate until l < r
- Calculate diff as arr[l] + arr[r]-x
- if abs (diff) < minDiff then update the minimum sum and pair.
- If arr[l] + arr[r] is less than X, this means if we want to find sum close to X, do r–
- If arr[l] + arr[r] is greater than 0,this means if we want to find sum close to X , do l++

**Java code:**

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
public static void findPairWithClosestToX(int arr[],int X) { int minimumDiff = Integer.MAX_VALUE; int n=arr.length; if(n<0) return; // left and right index variables int l = 0, r = n-1; // variable to keep track of the left and right pair for minimumSum int minLeft = l, minRight = n-1; while(l < r) { int currentDiff= Math.abs(arr[l] + arr[r]-X); /*If abs(diff) is less than min dif, we need to update sum and pair */ if(currentDiff < minimumDiff) { minimumDiff = currentDiff; minLeft = l; minRight = r; } if(arr[l] + arr[r] < X) l++; else r--; } System.out.println(" The pair whose sum is closest to X : "+arr[minLeft]+" "+ arr[minRight]); } |

Time complexity : O(NLogN)

### Java program to find a pair whose sum is closest to X:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
package org.arpit.java2blog; public class FindPairClosestToXMain { public static void main(String[] args) { int array[]={-40,-5,1,3,6,7,8,20}; findPairWithClosestToXBruteForce(array,5); findPairWithClosestToX(array,5); } public static void findPairWithClosestToXBruteForce(int arr[],int X) { if(arr.length<2) return; // Suppose 1st two element has minimum diff with X int minimumDiff=Math.abs(arr[0]+arr[1]-X); int pair1stIndex=0; int pair2ndIndex=1; for (int i = 0; i < arr.length; i++) { for (int j = i+1; j < arr.length; j++) { int tempDiff=Math.abs(arr[i]+arr[j]-X); if(tempDiff< minimumDiff) { pair1stIndex=i; pair2ndIndex=j; minimumDiff=tempDiff; } } } System.out.println(" The pair whose sum is closest to X using brute force method: "+arr[pair1stIndex]+" "+ arr[pair2ndIndex]); } public static void findPairWithClosestToX(int arr[],int X) { int minimumDiff = Integer.MAX_VALUE; int n=arr.length; if(n<0) return; // left and right index variables int l = 0, r = n-1; // variable to keep track of the left and right pair for minimumSum int minLeft = l, minRight = n-1; while(l < r) { int currentDiff= Math.abs(arr[l] + arr[r]-X); /*If abs(diff) is less than min dif, we need to update sum and pair */ if(currentDiff < minimumDiff) { minimumDiff = currentDiff; minLeft = l; minRight = r; } if(arr[l] + arr[r] < X) l++; else r--; } System.out.println(" The pair whose sum is closest to X : "+arr[minLeft]+" "+ arr[minRight]); } } |

1 2 3 4 |
The pair whose sum is closest to X using brute force method: 1 3 The pair whose sum is closest to X : 1 3 |