给定一个包括 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; } }