最接近的三数之和

题目:

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

 

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var threeSumClosest = function(nums, target) {
    let min=9999999999;
    let sum=0;
    for(let i=0;i<nums.length;i++){
        for(let j=i+1;j<nums.length;j++){
            for(let k=j+1;k<nums.length;k++){
                if(min>Math.abs(nums[i]+nums[k]+nums[j]-target)){
                    min = Math.abs(nums[i]+nums[k]+nums[j]-target);
                    sum = nums[i]+nums[k]+nums[j];
                }
            }
        }
    }
    return sum;
};

实现方式:直接三个循环找到相差最小的返回即可。

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
function comp(a,b){
    return a-b;
}
var threeSumClosest = function(nums, target) {
    nums.sort(comp);
    let ans = nums[0]+nums[1]+nums[2];
    
    for(let i=0;i<nums.length;i++){
         let left = i+1;
         let right = nums.length-1;
        while(left<right){
           let  sum = nums[i]+nums[left]+nums[right];
            if(Math.abs(target-sum)<Math.abs(target-ans)){
                ans = sum ;
            }else if(sum>target){
                right--;
            }else if(sum<target){
                left++;
            }else{
                return ans;
            }
        }
    }
    return ans;
};
View Code

实现方式:双指针,先进行排序,排序后,假设差距最小的数据是ans,设置一个外层for循环,内部通过双指针,先求出当前指向的三个数的和sum,并判断是sum与target的距离小呢还是ans与sum的距离小呢,如果是sum的比ans的距离小就将ans设置为sum的值,那就判断sum的大于target呢还是小于呢,如果是等于直接返回就可以了,没有比这更小的距离了,如果是大于,说明right指向的数有点大,所有将right--,如果是小于,说明left指向的数据有点小,所以可以将left++,当left>=right,也就是Left和right重合的时候将停止判断。i++.最后一直如此循环,最终返回差距最小的数据。

 

昨天的三数之和也是适用的双指针算法求得,https://www.cnblogs.com/panjingshuang/p/11632089.html

 

 

来源:https://leetcode-cn.com/problems/3sum-closest/solution/hua-jie-suan-fa-16-zui-jie-jin-de-san-shu-zhi-he-b/
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

posted @ 2019-10-08 19:54  唐糖PJS  阅读(142)  评论(0编辑  收藏  举报