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的处理, 在处理3Sum的时候,是将所有满足条件的和都保存起来,在处理此问题的时候,则要求解每次twoSum中与curtarget差值最小的和,最后在外层循环再求与最终target差值最小的和
class Solution {
public:
//类似于3Sum的处理, 在处理3Sum的时候,是将所有满足条件的和都保存起来,在处理此问题的时候,
//则要求解每次twoSum中与curtarget差值最小的和,最后在外层循环再求与最终target差值最小的和
int twoSum(vector<int> &nums, int n, int curStart, int curTarget)
{
int low = curStart, high = n - 1;
int minDiff = 99999999;
while(low < high)
{
int tmpSum = nums[low] + nums[high];
if( tmpSum == curTarget)
{
return tmpSum;
}
else if(tmpSum < curTarget)
{
int tmps = nums[low];
while(low < high && tmps == nums[low])
++low;
}
else
{
int tmps = nums[high];
while(low < high && tmps == nums[high])
--high;
}
minDiff = abs(tmpSum - curTarget) < abs(minDiff - curTarget) ? tmpSum : minDiff;
}
return minDiff;
}
int threeSumClosest(vector<int>& nums, int target) {
int len = nums.size();
if(len < 3)
return 0;
sort(nums.begin(), nums.end());
int minDiff = 99999999, i = 0;
while(i < len)
{
int curTarget = target - nums[i];
int diff = twoSum(nums, len, i + 1, curTarget);
minDiff = abs(minDiff - target) > abs(diff + nums[i] - target) ? diff + nums[i] : minDiff;
int tmps = nums[i];
while(i < len && nums[i] == tmps)
++i;
}
return minDiff;
}
};