主要思路:对数组进行排序,遍历数组,固定当前值,用双指针,left:从当前值的后一个值开始,right:从数组的最后一个节点开始,相向而行,【对三个值进行相加sum比较与target的距离】 和 【当前最小的结果ans与target的距离相比大小】,选择最小的更新ans,然后再进一步看当前sum和target的大小,如果更大,可以考虑right指针左移,再找小点的值;如果更小考虑left指针右移,两个指针如果相遇,就继续往数组的下一个值走,固定下一个值,再去确定left指针与right指针,循环往复即可。
class Solution {
public int threeSumClosest(int[] nums, int target) {
// 先排序
Arrays.sort(nums);
int ans = nums[0]+nums[1]+nums[2];
// 注意使用 i<nums.length-2
for(int i =0;i<nums.length-2;i++){
int left = i+1;
int right = nums.length-1;
while(left!=right){
int sum = nums[i]+nums[left]+nums[right];
// 判断当前的sum与target之间的距离 与 存的最小的ans与target之间的距离取最小的
if(Math.abs(sum-target)<Math.abs(ans-target)){
ans = sum;
}
// sum如果大于target,就right左移
// sum如果小于target,就left右移
if(sum>target){
right--;
}else{
left++;
}
}
}
return ans;
}
}