题目描述
解法
思路已经在【左右端点指针】LeetCode - 15. 三数之和 中较为详细地解释过了,不同的是,本题已经假定了只有唯一答案,所以不需要去重;这次不是和 0 比较,而是比较 abs(target-sum) 和 abs(target-ans)
另外的两个小优化(其实15中也体现了)
- 当我们枚举到恰好等于 target 的 a+b+c 时,可以直接返回 target 作为答案,因为不会有再比这个更接近的值了。
- 当我们枚举 a,b,c 中任意元素并移动指针时,可以直接将其移动到下一个与这次枚举到的不相同的元素,减少枚举的次数
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int ans = nums[0] + nums[1] + nums[2];
int len = nums.size();
for(int i = 0; i < len; i++)
{
//保证和上一次枚举的元素不一样
if(i > 0 && nums[i] == nums[i-1])
continue;
int start = i + 1, end = len - 1;
while(start < end)
{
int sum = nums[start] + nums[end] + nums[i];
//如果等于target,直接返回
if(sum == target)
return target;
if(abs(target-sum) < abs(target-ans))
ans=sum;
if(sum > target)
end--;
else
start++;
}
}
return ans;
}
};