链接
思路
-
利用两数之和的思想,题目提到答案只有唯一的一个,那么我们可以知道------遇到相等的直接返回,然后就是需要明确一点------会出现一样的元素,我们要保证这个元素唯一性
-
确定要第一个数字,剩下俩个数字进行两数之和,也需要明确跳出重复元素,并且不断缩小范围。
代码
javascript
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var threeSumClosest = function (nums, target) {
nums.sort((a, b) => a - b);
let res = Number.MAX_SAFE_INTEGER, n = nums.length;
// 排序后使用set去重
for (let i = 0; i < nums.length; i++) {
if (i > 0 && nums[i] === nums[i - 1]) {
continue;
}
let j = i + 1, k = n - 1
while (j < k) {
let sum = nums[i] + nums[j] + nums[k]
if (sum === target) return target
if (Math.abs(sum - target) < Math.abs(res - target)) {
res = sum
}
if (sum > target) {
let k0 = k - 1
while (j < k0 && nums[k0] == nums[k]) --k0
k = k0
}
else {
let j0 = j + 1
while (j0 < k && nums[j0] == nums[j]) ++j0
j = j0
}
}
}
return res;
};