最接近的三数之和

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

  解答:

  

public static int threeSumClosest(int[] nums,int target){
        /*对数组进行排序*/
        Arrays.sort(nums);
        /*定义一个返回值*/
        int res=nums[0]+nums[1]+nums[2];
        /*数组长度*/
        int length=nums.length;
        /*定义三个指针k,i,j,从最小值开始,i始终从k+1开始,j则从最大值开始*/
        for(int k=0;k<length-2;k++){
            int i=k+1;
            int j=length-1;
            /*循环内遍历当i不等于j时继续遍历*/
            while (i!=j){
                /*获取当前的最小值*/
                int min=nums[k]+nums[i]+nums[i+1];
                /*当目标值小于最小值时,到后面差值会越来越大,故break,后面的可以不用考虑了*/
                if(target<min){
                    /*当返回值与目标的差额比当前最小值与目标的差额大时,赋值返回值为当前最小值*/
                    if(Math.abs(res-target)>Math.abs(min-target)){
                        res= min;
                    }
                    break;
                }
                /*获取当前的最大值*/
                int max=nums[k]+nums[j]+nums[j-1];
                /*当目标值大于最大值时,到后面差值会越来越大,故break,后面的可以不用考虑了*/
                if(target>max){
                    /*当返回值与目标的差额比当前最大值与目标的差额大时,赋值返回值为当前最大值*/
                    if(Math.abs(res-target)>Math.abs(max-target)){
                        res=max;
                    }
                    break;
                }
                /*当前值总和*/
                int sum=nums[k]+nums[i]+nums[j];
                /*当返回值与目标的差额比当前值与目标的差额大时,赋值返回值为当前值*/
                 if(Math.abs(res-target)>Math.abs(sum-target)){
                     res=sum;
                 }
                 /*当前值大于目标值时,j减小,并去除重复的j的值*/
                 if(sum>target){
                     j--;
                     while (i!=j&&nums[j]==nums[j+1]){
                         j--;
                     }
                 }else if(Math.abs(sum-target)==0){
                     /*当前值与目标值的差值为0时,直接返回*/
                     return sum;
                 }else{
                     /*当前值小于目标值时,i增加,并去除重复的i值*/
                     i++;
                     while (i!=j&&nums[i]==nums[i-1]){
                         i++;
                     }
                 }
            }
            /*去除重复的k的值*/
            while (k<length-2&&nums[k]==nums[k+1]){
                k++;
            }
        }
        return res;
    }
View Code

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest

原文地址:https://www.cnblogs.com/wuyouwei/p/11872396.html