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).
bool compare(const int &a, const int &b) { return a<b; } class Solution { public: int threeSumClosest(vector<int> &num, int target) { int n = num.size(); int ret; int gap; sort(num.begin(),num.end(),compare); ret = num[0]+num[1]+num[2]; gap = abs(ret-target); for(int i = 0; i < n-1; i++) { if((i > 0)&&(num[i] == num[i-1]))continue; int a = target-num[i]; int j = i+1; int k = n-1; while(k > j) { if(a == num[j]+num[k]) { return target; } else if(a > num[j]+num[k]) { if(a-num[j]-num[k] < gap) { gap = a - num[j]-num[k]; ret = num[i]+num[j]+num[k]; } j++; while((num[j]==num[j-1])&&(j < n))j++; } else { if(num[j]+num[k]-a < gap) { gap = num[j]+num[k]-a; ret = num[i]+num[j]+num[k]; } k--; while((num[k]==num[k+1])&&(k > -1))k--; } } } return ret; } };