给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。 例如,给定数组 nums = [-1,2,1,-4], 和 target =1
与 target 最接近的三个数的和为 2.
(-1 + 2 + 1 = 2).
思想:
先进行排序Array.sort() [-4,-1,1,2] for nums.length <- i 表示如果nums[i]在三个数之中 若当前的sum-target的绝对值(当前误差)比最小误差小,则更新最小误差为当前误差, 循环内用一个双指针,left 为i+1 right为length-1,如果nums[i]+nums[left]+nums[right]< target 左指针向右增大当前值,否则右指针向左减小当前值。 误差inc初始化为MAX_INT [-4,-1,1,2,3] target=4
- 第一次循环(i=0):
-4先选中 在后面找[-1,1,2,3]两个数,以第一个-1和最后一个3 为开始,-1+3±4 = 2 小于4,左指针右移。误差 = 1-4=6 绝对值6小于当前误差,更新误差。
现在左指针指1 ,右指针指3 ,-4+1+3 = 0<target;左指针右移,误差更新为6,
现在左指针指2,右指针指3 ,sum= 1<target ;左指针右移,更新误差
指针碰撞,进入下一次循环 - 第二次循环(i=1):
-1先选中,在[1,2,3]中再找两个数,左指针从1开始,右指针从3开始。-1+3+1 = 3<target,左指针右移。误差=4-3 =1小于当前最小值。更新误差为3
现在左指针指2 右指针指3,2+3±1 = 4 = target。
找到了误差最小的,直接返回target。
源代码如下:
执行用时 : 16 ms, 在3Sum Closest的Java提交中击败了78.29% 的用户
内存消耗 : 37.6 MB, 在3Sum Closest的Java提交中击败了72.72% 的用户
class Solution {
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int sum;
int inAccurate = target - (nums[0]+nums[1]+nums[2]);
for(int i=0;i<nums.length-2;i++){
int left = i+1;
int right = nums.length-1;
while(left<right){
sum = nums[i]+nums[left]+nums[right];
if(Math.abs(inAccurate)>=Math.abs(target-sum)){
inAccurate = target -sum;
}
if(sum>target){
right--;
}
else if(sum<target){
left++;
}
else{
return target;
}
}
}
return target-inAccurate;
}
}