一、题目描述
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
二、思路分析
该题 与计算三数之和的区别就是:需要判断什么时候离 target 距离最近。
可以采用计算 sum【三数之和】与 target 差值的绝对值。绝对值越小说明 sum 离 target 越近,越大说明距离越远。
依然可以采用 排序 + 双指针 的方法:
第一次遍历如下:
第二次遍历:sum < target 移动左指针
第三次遍历: left 与 right 指针重合,结束循环。移动 i 指针
最终得到最终的结果:res = 2
代码:
public static int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int length = nums.length;
//初始化 res
int res = nums[0] + nums[1] + nums[2];
for (int i = 0; i < length; i++) {
int left = i + 1, right = length - 1;
// i 指针去重,防止有重复的组合
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
//sum 与 target 相等则直接返回
if (sum == target) {
return sum;
}
//根据差值判断是否更新 res
if (Math.abs(target - sum) < Math.abs(target - res)) {
res = sum;
}
if (sum > target) {
//right指针去重
while(left < right && nums[right] == nums[--right]);
} else {
//left 指针去重
while(left < right && nums[left] == nums[++left]);
}
}
}
return res;
}