Difficulty: Medium
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).
跟3Sum的思路一毛一样,做些小调整就好了。
int threeSumClosest(vector<int>& nums, int target) {
int ans = 9999999,ans1;
int len = nums.size();
sort(nums.begin(),nums.end());
for(int i = 0;i<len-2;i++){
int beg = i+1, en = len-1;
int expect;
while(en>beg){
expect = target - nums[beg] - nums[en] - nums[i];
if(nums[beg]==nums[beg-1]&&beg>i+1)
{ beg++;
continue;}
if(nums[en]==nums[en+1]&&en<len-1){
en--;
continue;}
if(expect>0){
//cout<<nums[i]<<nums[beg]<<nums[en]<<endl;
// cout<<"expect is "<<expect<<endl;
if(expect<ans)
{
ans1 = target-expect;
ans = expect;
}
beg++;
//cout<<ans1<<endl;
}
else if(expect<0){
// cout<<nums[i]<<nums[beg]<<nums[en]<<endl;
//cout<<"expect is "<<expect<<endl;
if(0-expect<ans)
{
ans1 = target-expect;
ans = 0-expect;
}
en--;
// cout<<ans1<<endl;
}
else{
return target;
}
}
}
return ans1;
}