给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var threeSumClosest = function(nums, target) {//nums = [-1,2,1,-4],target = 1;
let n=nums.length; //n=4
if(n===3){//如果数组长度为3,直接返回三个数的和
return getSum(nums);
}
nums.sort((a,b)=>a-b);//将数组进行排序 nums = [-4,-1,1,2];
let min=Infinity; //初始化最小值为一个无穷大的数
let res;//初始化返回的结果
for(let i=0;i<=nums.length-3;i++){// 从左往右依次尝试定一个基础指针 右边至少再保留两位 否则无法凑成3个数
let base=nums[i];//基础指针
let left=i+1;//左指针
let right=n-1;//右指针
while(left<right){
let sum=base+nums[left]+nums[right];//三个数的和
let diff=Math.abs(sum-target);//三个数的和与目标值的差, Math.abs() 函数可返回一个数的绝对值
if(diff<min){//如果差值小于最小值,则把最小值更新为差值,并且把三个数的和赋值给res
min=diff;
res=sum;
}
if(sum<target) {//如果三个数的和小于目标值,则左指针右移
left++;
}else if(sum>target){//如果三个数的和大于目标值,则右指针左移
right--;
}else {//如果三个数的和等于目标值,则直接返回三个数的和
return sum;
}
}
}
return res
};
//计算数组的和
function getSum(nums) {
return nums.reduce((total,cur)=>total+cur,0);//total为初始值,cur为当前值 ,0为初始值。
}
let nums = [-1,2,1,-4];
let target = 1;
console.log(threeSumClosest(nums,target));
以下图片来自菜鸟教程
这个算法题的思路就是,通过一个for循环,把三个数里的其中一个数作为从头开始遍历的数,其他两个数分别当作左右指针,通过比较在第一个数从头到尾的情况下的,循环判断左右指针加上第一个数所对应的数组的值之和是否是最小的,