16. 3Sum Closest
题目简介
/**
* @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
};