思路:和三数之和题目类似,使用双指针。
先将数组进行排序
选定左边的第一个数i作为定值(会遍历至倒数第三个数)
左指针L指向i+1,右指针R指向数组尾部
若i,start,end三数之和sum为0 ,直接返回结果
若sum<target,start++(因为是排过序的,所以每次都是在向目标值靠近,即间距最小)
若sum>target,end–(同理,也在缩小间距)
然后定值i++右移
var threeSumClosest = function(nums, target) {
let sortNumArr= nums.sort((a,b)=>a-b)
let len=sortNumArr.length
let res = Infinity
let gap =Infinity
for(let i=0;i<len-2;i++){
let start = i+1
let end = len-1
while(start<end){
let sum=sortNumArr[i]+sortNumArr[start]+sortNumArr[end]
gap=Math.min(gap,Math.abs(sum-target))
if(gap==Math.abs(sum-target)){
res=sum
}
if(sum<target){
//小技巧,跳过重复项
while(sortNumArr[start]==sortNumArr[++start]){}
}else if(sum>target){
while(sortNumArr[end]==sortNumArr[--end]){}
}else{
return res
}
}
}
return res
};