题目
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1. The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
和前一题很类似,只是和变成了target,依然可以做到n^2;
依旧按同样的思想操作。只是在和为target时直接返回;不为target时比较是否比当前最接近target的和更接近,是则暂存。
代码:
const int MAX=0x7fffffff;
class Solution {
public:
int threeSumClosest(vector<int> &num, int target) {
int ans=MAX;
long long sum; //三数和
int dsum=MAX; //最接近的sum和target的差的绝对值
int dt; //本次探测sum和target的差
int size=num.size();
sort(num.begin(),num.end());
int i=0,j=1,k=size-1;
while(j<k) //外循环
{
while(j<k) //Two Sum问题
{
sum=num[i]+num[j]+num[k];
dt=abs(sum-target);
if(sum==target)
return target;
else if(sum<target)
{
if(dt<dsum)
{
ans=sum;
dsum=dt;
}
j++;
}
else
{
if(dt<dsum)
{
ans=sum;
dsum=dt;
}
k--;
}
}
i++;
j=i+1;
k=size-1;
}
return ans;
}
};