最接近的三数之和 【LeetCode 数组】

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

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

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

思路:本题思路和三数之和比较像,只不过三数之和答案是一个List集合,并且需要判断是否重复,而本题不需要判断重复,因为答案只有一个。

         对于target-(a+b+c)的绝对值最小,我们遍历数组nums,固定遍历下标值a,然后另b=a+1,c=nums.leng-1,然后判断nums[a]+nums[b]+nums[c]-target的绝对值,然后进行更新和维护值就行,具体看代码。

import java.util.Arrays;
public class Main{
    public static void main(String[] args) {
        int[]a={-1,2,1,-4};
        System.out.println(threeSumClosest(a,1));
    }

    public static int threeSumClosest(int[] nums, int target) {
        Arrays.sort(nums);//先排序
        int len=nums.length;
        int dif=Integer.MAX_VALUE;  //绝对值的差值
        int value=0;  //三数之和

        for (int i = 0; i <= len-3; i++) {
            if(i>0 && nums[i]==nums[i-1]){//判断是否重复,重复则不用判断
                continue;
            }
            int l=i+1,r=len-1;
            while(l<r){
                int val=nums[i]+nums[l]+nums[r];
                int tempDif=Math.abs(val-target);//临时的绝对值的差值
                if(tempDif==0){//此时说明差值为0,即为最终值
                    return target;
                }else if(dif>tempDif){//如果找到一个差值更小,则进行更新
                    value=val;
                    dif=tempDif;
                }
                
                if(target>val){//此时判断三数之和与目标值的大小,因为是排序好的值,而且
                    l++;       //l和r分别是本次遍历的最小值和最大值,所以如果三数之和大于目标值
                }else {        //我们的值有点大,则减小值,这时另r--,可以减小值
                    r--;
                }
            }
        }
        return value;
    }
}
发布了225 篇原创文章 · 获赞 30 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_35634181/article/details/83034288