16. 3Sum Closest

Leetcode link

题目简介

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */

本题是 3 sum 的变体,要求我们从 nums 中找出三个数字之和与 target 差距最小,并最后返回三数之和

解题思路

这题我们还是用一层遍历 + 双指针的方式来做

区别在于我们需要每次多关注一个 minDiff 的参数更新,这个参数表示当前遍历过的所有三元组中,和与 target 差距最小的差距

如果差距为 0,则返回当前之和,否则要更新 minDiff 并记录当前之和

Javascript

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var threeSumClosest = function (nums, target) {
    nums.sort((a, b) => a - b)
    let minDiff = Infinity
    let res = Infinity
    const len = nums.length

    for (let i = 0; i < len; i++) {
        if (i > 0 && nums[i] === nums[i - 1]) {
            continue
        }

        let left = i + 1
        let right = len - 1

        while (left < right) {
            const curSum = nums[i] + nums[left] + nums[right]
            const curDiff = Math.abs(target - curSum)
            if (curDiff === 0) {
                return curSum
            }
            if (curDiff < minDiff) {
                minDiff = curDiff
                res = curSum
            }

            if (curSum < target) {
                left++
            } else {
                right--
            }
        }
    }

    return res
};

results matching ""

    No results matching ""