给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
提示:
3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4
public int threeSumClosest(int[] nums, int target) {
int ret=0;
//依旧先排序,便于计算目标范围
Arrays.sort(nums);
//第一重循环,确定第一位数
int temp= Integer.MAX_VALUE;//存储差值:因为提示了取值范围,所以三个数和target的差值已经不可能超过Integer.MAX_VALUE
for (int i=0;i< nums.length-2;i++){
int left=i+1;
int right=nums.length-1;
//双指针
while (left<right){
//因为之前有序的,所以当i+l+r>target,否则r+1比r更大,会导致>target更多
//当然i+l+r<target时候则需要右移l,否则会导致<target更小
//如果我们能找到刚好相等的结果直接结束循环,否则我们应该不停比较差值,留下最小值
int sum=nums[i]+nums[left]+nums[right];
if (sum>target){
right--;
}else if (sum<target){
left++;
}else {
return sum;
}
if (Math.abs(sum-target)<temp){
temp=Math.abs(sum-target);
ret=sum;
}
}
}
return ret;
}