算法挑战31: 最接近的三数之和

4 阅读1分钟

题目:

给你一个长度为 n 的整数数组 nums **和 一个目标值 target。请你从 nums **中选出三个在 不同下标位置 的整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

思路:

代码:

var threeSumClosest = function (nums, target) {
    //先排个序,再用相向双指针
    nums.sort((a, b) => a - b);

    let len = nums.length;
    //初始值赋值前三位,防止数组只有三个元素
    let res = nums[0] + nums[1] + nums[2];
    //初始值
    let minDiff = Math.abs(res - target);
    //外层依旧for循环
    for (let i = 0; i < len; i++) {
        const x = nums[i];
        let l = i + 1;
        let r = len - 1;
        while (l < r) {
            const sum = x + nums[l] + nums[r];
            //小于diff,就说明,这次离得更近
            let diff = Math.abs(sum - target)
            //更新res和最小差值
            if (chaa < cha){
            res = sum;
            minDiff = diff;
            }
            //处理下一轮
            if (sum > target) {
                r--;
            } else if (sum < target) {
                l++;
            }else {
            //如果sum === target的话,肯定最小的了,直接返回target就好了
                return target;
            }
        }
    }

    return res;

};