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;
    }
}

  

 

posted @ 2020-04-22 15:20  弓呆的胖次  阅读(141)  评论(0编辑  收藏  举报