题目:
给定一个包括 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; };
实现方式:双指针,先进行排序,排序后,假设差距最小的数据是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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。