LeetCode 16 最接近的三数之和,和三数之和框架一样,只是从"等于 target"变成"最接近 target"。
🟡 最接近的三数之和
找三个数使和最接近 target。
[-1,2,1,-4], target=1 → 2(-1+2+1=2)
和第 15 题三数之和几乎一样:排序→固定一个数→双指针。区别是找到一个和之后不返回------因为可能还有更接近的。每次算和三数之和跟 target 的差值,记录最小差值对应的和。
java
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int res = nums[0] + nums[1] + nums[2]; // 初始值
for (int i = 0; i < nums.length - 2; i++) {
int left = i + 1, right = nums.length - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (Math.abs(sum - target) < Math.abs(res - target)) res = sum;
if (sum < target) left++;
else if (sum > target) right--;
else return sum; // 差 0,不可能更接近了
}
}
return res;
}
和第 15 题比少了去重------不是找所有解,是找最近的一个,重复值不影响。也不用跳过 i 的重复。唯一的新东西是维护"最接近"的逻辑,绝对值差值更小就更新。
更多干货,欢迎访问我的算法笔记网站 codelu.cc,有兴趣的话可以去看看~
这道题你踩过什么坑?或者你用别的语言实现过吗?评论区聊聊,回头复习也方便翻。