给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
思路:本题思路和三数之和比较像,只不过三数之和答案是一个List集合,并且需要判断是否重复,而本题不需要判断重复,因为答案只有一个。
对于target-(a+b+c)的绝对值最小,我们遍历数组nums,固定遍历下标值a,然后另b=a+1,c=nums.leng-1,然后判断nums[a]+nums[b]+nums[c]-target的绝对值,然后进行更新和维护值就行,具体看代码。
import java.util.Arrays;
public class Main{
public static void main(String[] args) {
int[]a={-1,2,1,-4};
System.out.println(threeSumClosest(a,1));
}
public static int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);//先排序
int len=nums.length;
int dif=Integer.MAX_VALUE; //绝对值的差值
int value=0; //三数之和
for (int i = 0; i <= len-3; i++) {
if(i>0 && nums[i]==nums[i-1]){//判断是否重复,重复则不用判断
continue;
}
int l=i+1,r=len-1;
while(l<r){
int val=nums[i]+nums[l]+nums[r];
int tempDif=Math.abs(val-target);//临时的绝对值的差值
if(tempDif==0){//此时说明差值为0,即为最终值
return target;
}else if(dif>tempDif){//如果找到一个差值更小,则进行更新
value=val;
dif=tempDif;
}
if(target>val){//此时判断三数之和与目标值的大小,因为是排序好的值,而且
l++; //l和r分别是本次遍历的最小值和最大值,所以如果三数之和大于目标值
}else { //我们的值有点大,则减小值,这时另r--,可以减小值
r--;
}
}
}
return value;
}
}