力扣16. 最接近的三数之和(双指针)

给定一个包括  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循环,把三个数里的其中一个数作为从头开始遍历的数,其他两个数分别当作左右指针,通过比较在第一个数从头到尾的情况下的,循环判断左右指针加上第一个数所对应的数组的值之和是否是最小的,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值