给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
跟求三数之和差不多,甚至感觉比三数之和简单,因为有相等的情况直接返回target就可以了。。。
思路跟三数之和差不多,只是在三数之和上加了根据abs(ans-target)与abs(Sum-target)的大小判断是否更新ans值。。。
代码如下:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int Size=nums.size();
sort (nums.begin(),nums.end(),less<int>());
if(Size<3)
return 0;
int ans=0x3f3f3f3f;
for (int i=0;i<Size-2;i++)
{
if(i&&nums[i]==nums[i-1])
i++;
int j=i+1,k=Size-1;
while (j<k)
{
int Sum=nums[j]+nums[k]+nums[i];
if(Sum>target)
{
if(abs(ans-target)>Sum-target)
ans=Sum;
k--;
}
else if(Sum<target)
{
if(abs(ans-target)>target-Sum)
ans=Sum;
j++;
}
else
return target;
}
}
return ans;
}
};