This question is almost the same as #15. Just keep track of the current minimum distance during iterations.
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int min_dist = INT_MAX;//record the mini dist between sum and target
int res = 0;
int cur_sum;//temp current sum
int cur_dist;//temp current mini dist;
for(int i = 0; i < nums.size() - 2; i ++){
if(i-1>=0 && nums[i] == nums[i-1]) continue;
int left = i + 1;
int right = nums.size() - 1;
while(left < right){
cur_sum = nums[i] + nums[left] + nums[right];
cur_dist = abs(target - cur_sum);
if(cur_dist < min_dist){
min_dist = cur_dist;
res = cur_sum;
}
if(cur_sum < target){
left++;
}else if(cur_sum > target){
right --;
}else{
return target;
}
}
}
return res;
}
};