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).
之前做了2sum,发现思路可以延续到这个题上,不过今天状态不太好,思路很乱,要平复心境啊!做自己!!!
class Solution {
int abs(int x)
{
return x > 0 ? x : -x;
}
public:
int threeSumClosest(vector<int> &num, int target) {
sort(num.begin(), num.end());
int len = num.size();
int ret = num[0] + num[1] + num[2];
int top = target + abs(target - ret);
int buttom = target - abs(target - ret);
for(int i = 0; i < len - 2; i++)
{
int next = len - 1;
for(int j = i + 1; j < next; j++)
{
int part = num[i] + num[j];
int x;
while(next > j && (x = part + num[next]) > top)//对于递增的j,如果有对应的k使其最近,这个k一定小于j+1时k的上界
{
next--;
}
int k = next;
while(k > j && (x = part + num[k]) > buttom)
{
ret = x;
top = target + abs(target - ret);
buttom = target - abs(target - ret);
k--;
}
}
}
return ret;
}
};