Skip to main content

3Sum Closest

Problem

Given an integer array nums of length n and an integer target, find three integers in nums such that the sum is closest to target.

Return the sum of the three integers.

You may assume that each input would have exactly one solution.

 

Example 1:

Input: nums = [-1,2,1,-4], target = 1
Output: 2
Explanation: The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

Example 2:

Input: nums = [0,0,0], target = 1
Output: 0

 

Constraints:

  • 3 <= nums.length <= 1000
  • -1000 <= nums[i] <= 1000
  • -104 <= target <= 104

Solution

/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var threeSumClosest = function(nums, target) {
let res = Infinity;
nums.sort((a, b) => a - b);

for (let i = 0; i < nums.length - 2; i++) {
// skip duplicate starting values
if (i > 0 && nums[i] === nums[i - 1]) {
continue;
}

// modified sorted two sum solution
const sum = target - nums[i];
let lo = i + 1;
let hi = nums.length - 1;

while (lo < hi) {
const val = nums[lo] + nums[hi];
if (val > sum) {
hi--;
} else if (val < sum) {
lo++;
} else {
return target;
}
if (Math.abs(res - target) > Math.abs(val - sum)) {
res = val + nums[i];
}
}
}
return res;
};

The solution is similar to the 3Sum problem. The only difference is we keep track of the triplet with sum closest to target instead of all triplets that add up to 0.