16. 最接近的三数之和
题目
给你一个长度为 n
的整数数组 nums
和 一个目标值 target
。请你从 nums
中选出三个整数,使它们的和与 target
最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
示例 1:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2)。
示例 2:
输入:nums = [0,0,0], target = 1
输出:0
解释:与 target 最接近的和是 0(0 + 0 + 0 = 0)。
提示:
3 <= nums.length <= 1000
-1000 <= nums[i] <= 1000
-104 <= target <= 104
思路
这道题和15. 三数之和有什么区别呢?
距离,我们要求的是和与target之间的最近距离。所以思路上略微有些变化。
如果sum就等于target,直接返回
如果sum大于target,且和是正数,那么sum - target也一定是正数,若和是负数,那么sum - target一定是正数。
如果sum小于target,且和是正数,那么target - sum也一定是正数,若sum是负数,那么target - sum一定是正数。
这也是为什么两种情况下,算距离的公式不同
每次对比取更小的值,就可以获取到最近距离
class Solution {
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
// nums[i] + nums[j] + nums[k] == target
// nums[j] + nums[k] == target - nums[i]
int n = nums.length;
int minDif = Integer.MAX_VALUE;
int ans = 0;
for (int i = 0; i < nums.length - 2; i++) {
int j = i + 1, k = n - 1;
while (j < k) {
int sum = nums[i] + nums[j] + nums[k];
if (sum == target) {
return target;
} else if (sum > target) {
if (sum - target < minDif) {
minDif = sum - target;
ans = sum;
}
k--;
} else {
if (target - sum < minDif) {
minDif = target - sum;
ans = sum;
}
j++;
}
}
}
return ans;
}
}