LeetCode16 3SumClosest
题目描述:
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
解答:
解法一:排序法加双指针
跟15题三数和差不多,只是有些地方需要改一改。可以参考之前三数和的文章。
private static int solve(int[] nums, int target){
Arrays.sort(nums);
int len = nums.length;
int result=nums[0]+nums[1]+nums[len-1];
for (int i=0; i<len-2 ;i++){
int leave = target-nums[i];
int j=i+1, k=len-1;
while (j<k){
//result保存的是上一次的最小值。新一轮值更接近时
int sum2 = nums[j]+nums[k];
if (Math.abs(leave-sum2)< Math.abs(target- result)) { //target-nums[i]-nums[j]-nums[k]<target- result
result=nums[i]+sum2;
}
//题目的意思应该是没有相等的情况
if (sum2<leave){ //当前两个值太小了,需要增大j处的值
j++;
}else {//当前两个值太大了,需要减小k处的值
k--;
}
}
}
return result;
}