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).
pro:给一个数组,一个target,求数组中任意三个数的和与target的差的绝对值最小,给出这个和的值。
sol:仍然采用3-sum的思想。
1.将数组从小到大排序
2.枚举一个i,剩下的j和k使用2 Sum的思想分别从i+1和len-1开始,如果arr[j]+arr[k]>target,k--;否则j++;每次枚举的三个数,加起来做一次res的更新。
代码里对于arr中只有一个数和只有两个数的特殊处理显得很不elegant......
code:
class Solution {
public:
int threeSumClosest(vector<int> &num, int target) {
int i,j,k,len,left;
sort(num.begin(),num.end());
len = num.size();
int minn = 0x7fffffff;
int res;
if(len==0) return 0;
else if(len==1) return abs(target)<abs(target-num[0])?0:num[0];
else if(len==2)
{
if(abs(target)<abs(target-num[0])&&abs(target)<abs(target-num[1])&&abs(target)<abs(target-num[0]-num[1]))
return 0;
else if(abs(target-num[0])<abs(target)&&abs(target-num[0])<abs(target-num[1])&&abs(target-num[0])<abs(target-num[0]-num[1]))
return num[0];
else if(abs(target-num[1])<abs(target-num[0])&&abs(target-num[1])<abs(target)&&abs(target-num[1])<abs(target-num[0]-num[1]))
return num[1];
else return num[0]+num[1];
}
for(i=0;i<len-2;i++)
{
left = target-num[i];
j=i+1,k=len-1;
while(j<k)
{
if(abs(num[i]+num[j]+num[k]-target)<minn)
{
minn = abs(num[i]+num[j]+num[k]-target);
res = num[i]+num[j]+num[k];
}
if(num[j]+num[k]>left)
k--;
else j++;
}
}
return res;
}
};