- 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
- 返回这三个数的和。
var threeSumClosest = function (nums, target) {
nums.sort((a, b) => a - b);
const length = nums.length;
if(length<3) return
let result = nums[0] + nums[1] + nums[2];
if (target <= result) {
return result;
}
result = nums[length - 1] + nums[length - 2] + nums[length - 3];
if (target >= result) {
return result;
}
for (let i = 0; i < nums.length - 2; i++) {
if (nums[i] === nums[i + 1]) i++ //优化:当我们枚举 a, b, c中任意元素并移动指针时,可以直接将其移动到下一个与这次枚举到的不相同的元素,减少枚举的次数。
let s = i + 1;
let t = nums.length - 1;
while (s < t) {
if (nums[s] === nums[s + 1]) s++ //优化
if (nums[t] === nums[t- 1]) t--
const tmp = nums[i] + nums[s] + nums[t];
if (tmp < target) {
s++;
}
if (tmp > target) {
t--;
}
if (tmp === target) {
result = target;
break; //提前跳出循环
}
if (Math.abs(tmp - target) < Math.abs(result - target)) {
result = tmp;
}
}
if (result === target) {
return target;
}
}
return result;
};
此写法对于边界和需要提前退出的情况界定很清楚,也做了数组成员重复时的细小优化。