# 16. 3Sum Closest (Medium)

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

Given an array nums of n integers 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:

Given array nums = [-1, 2, 1, -4], and target = 1.

The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

## Solutions

class Solution {

// Solution for Problem 15 is a good template. Memorize it as possible as you can.

public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);

int ans = -1;
int min = Integer.MAX_VALUE;
for (int i = 0, l = nums.length; i < l - 2; i++) {

// nums[i - 1] is already calculated, skip nums[i] if same value with previous one
if (i != 0 && nums[i] == nums[i - 1]) {
continue;
}

int j = i + 1;
int k = l - 1;
while (j < k) {
if (j != i + 1 && (nums[j] == nums[j - 1])) {
j++;
continue;
}

// Since one exact solution only, stop searching to once found
int sum = nums[i] + nums[j] + nums[k];
if (sum == target) {
return sum;
}

// distance to target value, positive value
int dist = Math.abs(sum - target);
if (dist < min) {
min = dist;
ans = sum;
}

if (sum < target) {
j++; // approach target with larger value
}

if (sum > target) {
k--; // approach target with smaller value
}
}
}

return ans;
}
}