版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Somnus_k/article/details/82562635
思路:先将数组排序,固定第一个数k,然后设定两个指针i和j,i从k+1开始,j从nums.length-1开始,每次求nums[i]+nums[j]+nums[k]到target的距离,即绝对值。用一个变量保存距离,一个变量保存三个数的和,每次与之前的距离比较,如果比之前的距离小,则更新三个数的和,同时更新距离,如果nums[i]+nums[j]+nums[k]大于target,则将j左移,如果nums[i]+nums[j]+nums[k]小于target,则将i右移,以此缩小nums[i]+nums[j]+nums[k]与target的距离。
代码:
public class ThreeSumClosest {
public static void main(String[] args) {
int[] nums={-1, 2, 1, -4};
System.out.println(threeSumClosest(nums,1));
}
public static int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int closest = Integer.MAX_VALUE;
int abs = Integer.MAX_VALUE;
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)<abs){
closest = sum;
abs = Math.abs(sum-target);
}
if(sum-target<0)
left++;
else if(sum-target>0)
right--;
else
return sum;
}
}
return closest;
}
}
输出:2