题目:
- 给你一个长度为
n
的整数数组nums
和 一个目标值target
。请你从nums
中选出三个整数,使它们的和与target
最接近。- 返回这三个数的和。
- 假定每组输入只存在恰好一个解。
提示:
3 <= nums.length <= 1000
-1000 <= nums[i] <= 1000
-10^4 <= target <= 10^4
示例:
代码编程
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int ans = 1e5;
//3 <= nums.length <= 1000
//-1000 <= nums[i] <= 1000
//-10^4 <= target <= 10^4
//根据提示,可以得出当前target的数值可以很大
//所以需要把ans的初始值设置一个较大的数值
//初始化为1e5,这个值足够大,
//可以确保在第一次比较时,任何合法的三数之和都会比它更接近目标值。
int n = nums.size();
//总体的方法还是和三数之和的算法一样,使用双指针算法解决,
//但是解决的对象不一样了
sort(nums.begin() , nums.end());
for(int i = 0 ; i < n ; i++)
{
for(int l = i + 1 , r = n - 1; l < r;)
{
int res = abs(target - (nums[i] + nums[l] + nums[r]));
//res用于计算当前三数之和与目标值的差的绝对值。
int res1 = target - (nums[i] + nums[l] + nums[r]);
//res1用于直接进行计算当前的三数之和和目标值之间的差距,
//以此进行双指针的移动判断
if(res < abs(ans - target))
ans = nums[i] + nums[l] + nums[r];
//当找到一个更接近目标值的三数之和时,更新ans
//随着res(也就是target与三数之和 之差 的绝对值)的变化而变化
else if(res == 0)
return nums[i] + nums[l] + nums[r];
//当差距等于0时直接返回这三个数值的和
else if(res1 > 0)
l++;//进行移动
else if(res1 < 0)
r--;//进行移动
}
}
return ans;
}
};
题目来源:18. 四数之和 - 力扣(LeetCode)
三数之和链接:15. 三数之和 - 力扣(LeetCode)