class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int result = nums[0] + nums[1] + nums[2];
int gap = abs(result - target);
//if(nums.size()<3) return result;
sort(nums.begin(), nums.end());
//vector<int> tmp;
for (int i = 0; i<nums.size() - 2; i++){
twoSumClosest(nums, i + 1, target - nums[i], result, gap);
}
return result;
}
void twoSumClosest(vector<int>& nums, int start, int target, int& result, int& gap){
//vector<int> result;
int left = start, right = nums.size() - 1;
while (left<right){
if (abs(nums[left] + nums[right] - target)<gap){
gap = abs(nums[left] + nums[right] - target);
result = nums[left] + nums[right] + nums[start - 1];
}
if (nums[left] + nums[right]<target){
left++;
}
else if (nums[left] + nums[right]>target){
right--;
}
else{
gap = 0;
result = nums[left] + nums[right] + nums[start - 1];
break;
}
}
}
};