Home 3Sum Closest
Post
Cancel

LeetCode #16: 3Sum Closest (C/C++).

medium

source: https://leetcode.com/problems/3sum-closest/
C/C++ Solution to LeetCode problem 16. 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.

Examples


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
Explanation: The sum that is closest to the target is 0. (0 + 0 + 0 = 0).

Constraints


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

Solution


We will use a Two Pointers technique. See the LeetCode Problem 15.
Some particular things for this problem:

  • If the sum of the three numbers is equal to the target, we return that value.
  • After adding the three numbers, we get the absolute difference with the target and update the closest value found.
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
class Solution {
public:
  int threeSumClosest(vector<int>& nums, int target) {
    int sum = 0;
    int closest = INT_MAX/2;

    sort(nums.begin(), nums.end());
    for (int i=0; i<nums.size()-2; i++) {
      if (i>0 && nums[i] == nums[i-1])
        continue;
        
      int l = i + 1;
      int r = nums.size() - 1;
      while (l<r) {
        sum = nums[i] + nums[l] + nums[r];
        if (sum == target)
          return sum;
          
        if (abs(sum - target) < abs(closest - target))
          closest = sum;
          
        if (sum < target)
          l++;
        else
          r--;
      }
    }

    return closest;
  }
};
This post is licensed under CC BY 4.0 by the author.

3Sum

Letter Combinations of a Phone Number