16-最接近的三数之和
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
思路:和15题的三数之和如出一辙,15是要求求出三个数等于零的集合,还要求集合不重复。本题说了只有一个答案,而且返回的是这个和,不是三个数组成的List,方便了不少。
还是遍历【0,length-2】之间的所有数,对于每一个数。使用双指针找这个数右边的子数组里的两个数。初始时,把0,1,2这三个下标的数做个加法,得到 juli这个变量,求新的三数之和,和target-juli之间哪个更小,如果有了新的最小值,juli=sum,开启下个循环。如果juli==sum,直接返回结果就行。因为不可能有更接近的结果了。否则,假如target<sum,右指针减一。。。
Math.abs()函数是求绝对值的,记住用!
class Solution {//比起上一题求sum==0的三数之和,少了各种去掉冲服情况的语句,因为上一期是找不重复三元组,这里题目假设只有一个结果了,此外,返回的是总和而不是差值,记住abs函数
public int threeSumClosest(int[] nums, int target) {
// List<List<Integer>> res=new ArrayList();
int len=nums.length;
Arrays.sort(nums);//排序
if(len<3||nums==null)
{
return 1000;
}
int juli=nums[0]+nums[1]+nums[2];
for(int i=0;i<len-2;i++)
{
//if(i>0&&nums[i]==nums[i-1])continue;//少了这一步去重,-1! I和L R都用去重
int L=i+1;
int R=len-1;
while(L<R)
{
int sum=nums[i]+nums[L]+nums[R];
// int jushi=target-sum;
//if(jushi<0) jushi=-jushi;
if(Math.abs(target - sum) < Math.abs(target - juli))//重要
{
juli=sum;
}
else if((target-sum)>0)//目标值大于sum。说明left有点小
{
L++;
}
else if((target-sum)<0)
{
R--;
}
else
{
return juli;
}
}
}
return juli;
}
}

浙公网安备 33010602011771号