16. 最接近的三数之和
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
与上一篇博文方法类似。
class Solution {
//这道题与3sum类似,可参考上一篇
public int threeSumClosest(int[] nums, int target) {
int p,k,q;
int len = nums.length;
int res = nums[0] + nums[1] + nums[len - 1];
//先排序
Arrays.sort(nums,0,len);
for(p = 0;p < len;++p){
//固定p,进行遍历
if(p - 1 >= 0 && nums[p] == nums[p - 1])
continue;
q = len - 1;
k = p + 1;
//k,q进行夹逼
while(k < q){
int sum = nums[p] + nums[k] + nums[q];
//每回比较全局最小
if(Math.abs(sum - target) < Math.abs(res - target)){
res = sum;
}
sum -= target;
if(sum < 0){
++k;
while(k < q && nums[k] == nums[k - 1])
++k;
}else{
if(sum > 0){
--q;
while(k < q && nums[q] == nums[q + 1])
--q;
}else
return target;
}
}
}
return res;
}
}