给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
Given an integer array nums of length n and an integer target, find three integers in nums such that the sum is closest to target.
Return the sum of the three integers.
You may assume that each input would have exactly one solution.
示例 1:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
示例 2:
输入:nums = [0,0,0], target = 1
输出:0
这个题目可以不用将重复值特殊对待,因为求的是三个数之和最接近目标值
- 将获取的数组进行升序排列
- 获取最初的三数之和 nums[0] + nums[1] + nums[2]
- 将列表进行遍历,将两个指针分别指向i+1和len-1,两个指针往中间靠拢
- 当遇到|sum - target|<|res - target|,将res值进行更新
- l++ r–是什么情况下的呢,
当三数之和<目标值,l指针往右走l++
当三数之和>目标值,r指针往右走r–
当三数之和==目标值,直接返回res。(题目中恰好一个解。) - 当循环结束时将res的值返回
var threeSumClosest = function (nums, target) {
nums.sort((a, b) => { return a - b })
let len = nums.length
let res = nums[0] + nums[1] + nums[2]
for (let i = 0; i < len; i++) {
let l = i + 1
let r = len - 1
while (l < r) {
let sum = nums[i] + nums[l] + nums[r]
if (Math.abs(sum - target) < Math.abs(res - target)) {
res = sum
}
if (sum < target) {
l++
} else if (sum > target) {
r--
} else {
return res
}
}
}
return res
};