DDSA Solutions

Sum Pair closest to target

Advertisement

Intuition

Find pair with sum closest to target. Sort + two pointers tracking minimum difference.

Algorithm

  1. 1Sort. l=0, r=n-1. Track minDiff and best pair. If sum < target: l++. If sum > target: r--. If equal: return.

Common Pitfalls

  • Same as LC 1679 variant. Sort first. Update best when |sum - target| < minDiff.
Sum Pair closest to target.java
Java
// Approach: Sort array. Two pointers from ends: track closest pair sum to target, move pointers accordingly.
// Time: O(n log n) Space: O(1)
import java.util.*;

class Solution {
    public List<Integer> sumClosest(int[] arr, int target) {
        Arrays.sort(arr);
        List<Integer> res = new ArrayList<>();
        int l = 0;
        int h = arr.length - 1;
        int a = -1;
        int b = -1;
        int maxDiff = 0;

        while (l < h) {
            int sum = arr[l] + arr[h];

            if (sum <= target) {
                if (Math.abs(target - sum) < Math.abs(target - (a + b))
                        || (sum == a + b && Math.abs(arr[l] - arr[h]) > maxDiff)) {
                    a = arr[l];
                    b = arr[h];
                    maxDiff = Math.abs(arr[l] - arr[h]);
                }
                l++;
            } else {
                if ((a == -1 && b == -1) || Math.abs(target - sum) < Math.abs(target - (a + b))
                        || (sum == a + b && Math.abs(arr[l] - arr[h]) > maxDiff)) {
                    a = arr[l];
                    b = arr[h];
                    maxDiff = Math.abs(arr[l] - arr[h]);
                }
                h--;
            }
        }

        if (a != -1 && b != -1) {
            res.add(a);
            res.add(b);
        }

        return res;
    }
}
Advertisement
Was this solution helpful?