Skip to content

16. 3Sum Closest

https://leetcode.com/problems/3sum-closest/

c++
class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(), nums.end());
        int result = INT_MAX / 2;
        for (int i = 0; i < nums.size() - 2; i++) {
            int left = i + 1;
            int right = nums.size() - 1;
            while (left < right) {
                int sum = nums[i] + nums[left] + nums[right];
                if (sum == target) {
                    return target;
                }
                if (abs(sum - target) < abs(result - target)) {
                    result = sum;
                }
                if (sum < target) {
                    left++;
                } else {
                    right--;
                }
            }
        }
        return result;
    }
};
go
func threeSumClosest(nums []int, target int) int {
  sort.Ints(nums)
  result := math.MaxInt / 2
  for i := 0; i < len(nums)-2; i++ {
    left, right := i+1, len(nums)-1
    for left < right {
      sum := nums[i] + nums[left] + nums[right]
      if sum == target {
        return target
      }
      if math.Abs(float64(sum-target)) < math.Abs(float64(result-target)) {
        result = sum
      }
      if sum < target {
        left++
      } else {
        right--
      }
    }
  }
  return result
}
js
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var threeSumClosest = function(nums, target) {
  nums.sort((a, b) => a - b)
  let result = Infinity
  for (let i = 0; i < nums.length - 2; i++) {
    let left = i + 1
    let right = nums.length - 1
    while (left < right) {
      const sum = nums[i] + nums[left] + nums[right]
      if (sum === target) {
        return target
      }
      if (Math.abs(sum - target) < Math.abs(result - target)) {
        result = sum
      }
      if (sum < target) {
        left++
      } else {
        right--
      }
    }
  }
  return result
};
py
class Solution(object):
    def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        nums.sort()
        result = float('inf')
        for i in range(len(nums) - 2):
            left, right = i + 1, len(nums) - 1
            while left < right:
                s = nums[i] + nums[left] + nums[right]
                if s == target:
                    return target
                if abs(s - target) < abs(result - target):
                    result = s
                if s < target:
                    left += 1
                else:
                    right -= 1
        return result