16. 最接近的三数之和
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
示例 1
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
示例 2
输入:nums = [0,0,0], target = 1
输出:0
答案
基于三数之和
思路:while 配合 for 比较多个数的值
- 防御性:
if(!nums || nums.length <3)return []
- 排序
- 声明三数之和
sum
和 最小值let min = Infinity
- for 从 0 向后遍历
- 去重:若当前这一项和上一项相等则跳过
- 声明对撞指针:
left = i+1 / right
- while 循环条件:
while(left < right)
- 计算
sum = nums[i] + nums[left] + nums[right]
- 计算最小值:
if (Math.abs(sum - target) < Math.abs(min - target)) {
min = sum
} - sum 比较 target
- 小于:left ++ / 大于:right --
- 相等: 直接返回 sum
- 计算
const threeSumClosest = (nums, target) => {
if(!nums || nums.length <3)return []
// 排序
nums = nums.sort((a,b)=>a-b)
// 三数之和
let sum = 0
// 结果数组
// let result = []
// 初始化一个最小值
let min = Infinity;
// 对撞指针
for(let i=0;i<nums.length;i++){
// 去重:若当前这一项和上一项相等则跳过
if(nums[i] === nums[i-1])continue
let left = i+1
let right = nums.length-1
while(left < right){
sum = nums[i] + nums[left] + nums[right]
// 如果当前和更接近,更新最小值
if (Math.abs(sum - target) < Math.abs(min - target)) {
min = sum;
}
if(sum > target){ // 大于
right --
}else if(sum < target){ // 小于
left ++
}else{ // 相等
return sum
}
}
}
return min
}
var nums = [-1, 2, 1, -4]
var target = 1
console.log(threeSumClosest(nums, target))