问题是需要找三个数字之和离target 最近的一组组合。 首先判断输入的数组是否有足够的数字提供组合,及num.length>=3。 同K sum 问题现将数组排序,同样固定一个数字,使用双指针去找另两个。定义两个变量,closet 和 re。 closet 用于更新现在离target最近的距离,re用于保存发现的最短距离target的sum值。 首先给closet赋最大值,然后每次发现 sum - target的绝对值小于closet, 更新closet,记录 sum。时间:20 ms 90.40%
class Solution {
static int closet ;
static int re;
public int threeSumClosest(int[] nums, int target) {
if(nums.length <3||nums == null){return 0;}
Arrays.sort(nums);
int len = nums.length;
re= 0;
closet = Integer.MAX_VALUE;
for(int i=0;i<len-2;i++){
find(nums,i+1,len-1,nums[i],target);
}
return re;
}
public void find(int[] num, int l,int r,int cur,int target){
while(l<r){
int sum = num[l] + num[r] +cur;
if(Math.abs(sum-target)<closet){
closet = Math.abs(sum-target);
re = sum;
}
if(sum < target){
l++;
}
else{r--;}
}
}
}