思路:
【双指针解法】
1.首先对给定的数组从小到大排序
2.对数组进行循环遍历,首先固定一个数nums[i],在nums[i]的右侧定义双指针L,R,
L = i + 1, R = nums.length - 1
3.当L小于R时,取得sum = nums[i] + nums[L] + nums[R]的值,判断sum与target的距离,若是sum比target小则L++,若是sum比target大则R–,若是sum === target,则直接返回sum
let nums = [ -1, 2, 1, -4 ]
let target = 1
var threeSumClosest = function(nums, target) {
// 获取nums数组的长度
let N = nums.length
// num的初始值为在js中可取得的最大值,后续再替换。作用是保存最接近target的数
let num = Number.MAX_SAFE_INTEGER
// 对数组进行从小到大排序(sort((a, b) => a - b)为从小到大排序, sort((a, b) => b - a)为从大到小排序)
nums.sort((a, b) => a - b)
// 遍历数组
for(let i = 0; i < nums.length; i++) {
// 定义左指针L,L为i的后一位i + 1
let L = i + 1
// 定义右指针R,R为数组的最后一位
let R = N - 1
// 当L小于R时循环
while(L < R) {
// 把当前的数,也就是nums[i]与双指针指定的数值相加
let sum = nums[i] + nums[L] + nums[R]
/** 取(sum - target)和(num - target)的绝对值进行比较,
若是(sum - target)的值小于(num - target)的值,就把sum赋值给num。
因为离target最近的数可能为正数也可能为负数,所以要取绝对值进行比较。
若是(sum - target)比(num - target)要小,说明sum相距target更近,所以把
sum复制给num
**/
if(Math.abs(sum - target) < Math.abs(num - target)) {
num = sum
}
/** 因为数组现在是从小到大排序,当sum小于target时,将L递增,则sum会增大 **/
if(sum < target) {
L++
}
/** 当sum > target时,将R递减, 则sum会减小 **/
else if(sum > target) {
R--
}
/** 如果sum === target,则说明nums[i] + nums[L] + nums[R] === target,不会有其他数比sum更接近target了,所以直接返回sum即可 **/
else {
return sum
}
}
}
return num
}
threeSumClosest(nums, target)