思路:
双指针(步骤如↓↓↓)
- 排序 *(降序)
- 固定一个数n1(从第一个数开始),然后在数组头部找到n2 (left指针),在数组尾部找到n3(right指针)
- sum=n1+n2+n3,为了靠近target(开始循环),如果:
sum > target,说明sum应该更小一点,left指针就应该往后走。
sum < target,说明sum应该更大一点,right指针就应该往前走。
- |sum-target| 越小,说明越接近target。找到最小值,并返回当前sum,完毕!
时间复杂度:O(n^2)let nums = [-1,2,1,-4], target = 1
var threeSumClosest = function (nums, target) {
nums = nums.sort((a, b) => b - a)
let near = Infinity
let res
for (let i = 0; i < nums.length - 2; i++) {
let norm = i, left = norm + 1, right = nums.length - 1
while (left < right) {
let sum = nums[norm] + nums[left] + nums[right]
let abs = Math.abs(target - sum)
if (abs < near) {
near = abs;
res = sum;
}
if (sum > target) {
left++;
} else {
right--;
}
}
}
return res
};
console.log(threeSumClosest(nums, target));
空间复杂度:O(n)