Find the closest pair from two sorted arrays
Last Updated :
29 Oct, 2025
Given two arrays arr1[0…m-1] and arr2[0…n-1], and a positive integer x, find a pair (arr1[i], arr2[j]) such that the absolute difference |arr1[i] + arr2[j] - x| is minimized.
Example:
Input: arr1[] = {1, 4, 5, 7}, arr2[] = {10, 20, 30, 40}, x = 32
Output: [1, 30]
Input: arr1[] = {1, 4, 5, 7}, arr2[] = {10, 20, 30, 40}, x = 50
Output: [7, 40]
[Approach] Find the closest pair from two sorted arrays using Nested Loop:
A Simple Solution is to run two loops. The outer loop considers every element of first array and inner loop checks for the pair in second array. We keep track of minimum difference between ar1[i] + ar2[j] and x.
[Expected Approach] Sorting and Binary Search:
The key idea is to sort one of the arrays (say arr2) so we can efficiently find, for each element in arr1, the element in arr2 that makes the sum closest to x. For every arr1[i], we look for the value x - arr1[i] in arr2 using binary search. Since the exact value might not exist, we compare the closest elements around the found position to determine which gives the smaller absolute difference. This way, we minimize the difference without checking every possible pair.
C++
#include <iostream>
#include <vector>
#include <climits>
#include <cstdlib>
using namespace std;
// Helper function to perform binary search on arr2
// Returns the index of the element closest to 'target'
int findClosestIndex(vector<int> &arr2, int target)
{
int left = 0, right = arr2.size() - 1;
int closestIdx = -1;
int minDiff = INT_MAX;
while (left <= right)
{
int mid = left + (right - left) / 2;
int diff = abs(arr2[mid] - target);
if (diff < minDiff)
{
minDiff = diff;
closestIdx = mid;
}
if (arr2[mid] == target)
return mid;
else if (arr2[mid] < target)
left = mid + 1;
else
right = mid - 1;
}
return closestIdx;
}
// Function to find the closest pair sum to x using binary search
vector<int> findClosestPair(vector<int> &arr1, vector<int> &arr2, int x)
{
int n = arr1.size();
int m = arr2.size();
int diff = INT_MAX;
vector<int> result(2);
// Traverse each element in arr1 and find its closest counterpart in arr2
for (int i = 0; i < n; i++)
{
int target = x - arr1[i];
// Find the index of the closest element to target in arr2
int idx = findClosestIndex(arr2, target);
// Check if this pair gives a closer sum to x
if (idx != -1 && abs(arr1[i] + arr2[idx] - x) < diff)
{
diff = abs(arr1[i] + arr2[idx] - x);
result[0] = arr1[i];
result[1] = arr2[idx];
}
}
return result;
}
int main()
{
// Input arrays and target sum
vector<int> arr1 = {1, 4, 5, 7};
vector<int> arr2 = {10, 20, 30, 40};
int x = 38;
// Find the closest pair
vector<int> closest = findClosestPair(arr1, arr2, x);
// Print the result
cout << "[" << closest[0] << ", " << closest[1] << "]" << endl;
return 0;
}
Java
import java.util.*;
class Main {
// Helper function to perform binary search on arr2
// Returns the index of the element closest to 'target'
static int findClosestIndex(int[] arr2, int target) {
int left = 0, right = arr2.length - 1;
int closestIdx = -1;
int minDiff = Integer.MAX_VALUE;
while (left <= right) {
int mid = left + (right - left) / 2;
int diff = Math.abs(arr2[mid] - target);
if (diff < minDiff) {
minDiff = diff;
closestIdx = mid;
}
if (arr2[mid] == target)
return mid;
else if (arr2[mid] < target)
left = mid + 1;
else
right = mid - 1;
}
return closestIdx;
}
// Function to find the closest pair sum to x using binary search
static ArrayList<Integer> findClosestPair(int[] arr1, int[] arr2, int x) {
int n = arr1.length;
int m = arr2.length;
int diff = Integer.MAX_VALUE;
ArrayList<Integer> result = new ArrayList<>(Arrays.asList(0, 0));
// Traverse each element in arr1 and find its closest counterpart in arr2
for (int i = 0; i < n; i++) {
int target = x - arr1[i];
// Find the index of the closest element to target in arr2
int idx = findClosestIndex(arr2, target);
// Check if this pair gives a closer sum to x
if (idx != -1 && Math.abs(arr1[i] + arr2[idx] - x) < diff) {
diff = Math.abs(arr1[i] + arr2[idx] - x);
result.set(0, arr1[i]);
result.set(1, arr2[idx]);
}
}
return result;
}
public static void main(String[] args) {
// Input arrays and target sum
int[] arr1 = {1, 4, 5, 7};
int[] arr2 = {10, 20, 30, 40};
int x = 38;
// Find the closest pair
ArrayList<Integer> closest = findClosestPair(arr1, arr2, x);
// Print the result
System.out.println("[" + closest.get(0) + ", " + closest.get(1) + "]");
}
}
Python
# Helper function to perform binary search on arr2
# Returns the index of the element closest to 'target'
def findClosestIndex(arr2, target):
left, right = 0, len(arr2) - 1
closestIdx = -1
minDiff = float('inf')
while left <= right:
mid = left + (right - left) // 2
diff = abs(arr2[mid] - target)
if diff < minDiff:
minDiff = diff
closestIdx = mid
if arr2[mid] == target:
return mid
elif arr2[mid] < target:
left = mid + 1
else:
right = mid - 1
return closestIdx
# Function to find the closest pair sum to x using binary search
def findClosestPair(arr1, arr2, x):
n = len(arr1)
m = len(arr2)
diff = float('inf')
result = [0, 0]
# Traverse each element in arr1 and find its closest counterpart in arr2
for i in range(n):
target = x - arr1[i]
# Find the index of the closest element to target in arr2
idx = findClosestIndex(arr2, target)
# Check if this pair gives a closer sum to x
if idx != -1 and abs(arr1[i] + arr2[idx] - x) < diff:
diff = abs(arr1[i] + arr2[idx] - x)
result[0] = arr1[i]
result[1] = arr2[idx]
return result
# Input arrays and target sum
arr1 = [1, 4, 5, 7]
arr2 = [10, 20, 30, 40]
x = 38
# Find the closest pair
closest = findClosestPair(arr1, arr2, x)
# Print the result
print(f"[{closest[0]}, {closest[1]}]")
C#
using System;
using System.Collections.Generic;
class Program
{
// Helper function to perform binary search on arr2
// Returns the index of the element closest to 'target'
static int FindClosestIndex(int[] arr2, int target)
{
int left = 0, right = arr2.Length - 1;
int closestIdx = -1;
int minDiff = int.MaxValue;
while (left <= right)
{
int mid = left + (right - left) / 2;
int diff = Math.Abs(arr2[mid] - target);
if (diff < minDiff)
{
minDiff = diff;
closestIdx = mid;
}
if (arr2[mid] == target)
return mid;
else if (arr2[mid] < target)
left = mid + 1;
else
right = mid - 1;
}
return closestIdx;
}
// Function to find the closest pair sum to x using binary search
static List<int> FindClosestPair(int[] arr1, int[] arr2, int x)
{
int n = arr1.Length;
int m = arr2.Length;
int diff = int.MaxValue;
List<int> result = new List<int> { 0, 0 };
// Traverse each element in arr1 and find its closest counterpart in arr2
for (int i = 0; i < n; i++)
{
int target = x - arr1[i];
// Find the index of the closest element to target in arr2
int idx = FindClosestIndex(arr2, target);
// Check if this pair gives a closer sum to x
if (idx != -1 && Math.Abs(arr1[i] + arr2[idx] - x) < diff)
{
diff = Math.Abs(arr1[i] + arr2[idx] - x);
result[0] = arr1[i];
result[1] = arr2[idx];
}
}
return result;
}
static void Main()
{
// Input arrays and target sum
int[] arr1 = { 1, 4, 5, 7 };
int[] arr2 = { 10, 20, 30, 40 };
int x = 38;
// Find the closest pair
List<int> closest = FindClosestPair(arr1, arr2, x);
// Print the result
Console.WriteLine($"[{closest[0]}, {closest[1]}]");
}
}
JavaScript
// Helper function to perform binary search on arr2
// Returns the index of the element closest to 'target'
function findClosestIndex(arr2, target) {
let left = 0, right = arr2.length - 1;
let closestIdx = -1;
let minDiff = Number.MAX_SAFE_INTEGER;
while (left <= right) {
let mid = Math.floor(left + (right - left) / 2);
let diff = Math.abs(arr2[mid] - target);
if (diff < minDiff) {
minDiff = diff;
closestIdx = mid;
}
if (arr2[mid] === target)
return mid;
else if (arr2[mid] < target)
left = mid + 1;
else
right = mid - 1;
}
return closestIdx;
}
// Function to find the closest pair sum to x using binary search
function findClosestPair(arr1, arr2, x) {
let n = arr1.length;
let m = arr2.length;
let diff = Number.MAX_SAFE_INTEGER;
let result = [0, 0];
// Traverse each element in arr1 and find its closest counterpart in arr2
for (let i = 0; i < n; i++) {
let target = x - arr1[i];
// Find the index of the closest element to target in arr2
let idx = findClosestIndex(arr2, target);
// Check if this pair gives a closer sum to x
if (idx !== -1 && Math.abs(arr1[i] + arr2[idx] - x) < diff) {
diff = Math.abs(arr1[i] + arr2[idx] - x);
result[0] = arr1[i];
result[1] = arr2[idx];
}
}
return result;
}
// Input arrays and target sum
let arr1 = [1, 4, 5, 7];
let arr2 = [10, 20, 30, 40];
let x = 38;
// Find the closest pair
let closest = findClosestPair(arr1, arr2, x);
// Print the result
console.log(`[${closest[0]}, ${closest[1]}]`);
Time Complexity : O(n*logm)
Auxiliary Space : O(1)
Smallest Difference pair of values between two unsorted Arrays
Explore
DSA Fundamentals
Data Structures
Algorithms
Advanced
Interview Preparation
Practice Problem