题目

思路
排序+双指针



知识点
减去负数溢出
防止减去一个负数溢出,如果target是负数,ans-target就会溢出
int ans = INT_MAX / 2;

abs绝对值函数
abs 是 C++ 中的绝对值函数(absolute value),返回一个数的非负值。
题解
注意for循环需要从0遍历到nums.size()-2
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int ans=INT_MAX/2;
for(int i=0;i<nums.size()-2;i++){
if(i>0 && nums[i]==nums[i-1]){
continue;
}
int s=nums[i]+nums[i+1]+nums[i+2];
if(s>target){
if(abs(s-target)<abs(ans-target)){
ans=s;
}
break;
}
s=nums[i]+nums[nums.size()-1]+nums[nums.size()-2];
if(s<target){
if(abs(s-target)<abs(ans-target)){
ans=s;
}
continue;
}
int left=i+1;
int right=nums.size()-1;
while(left<right){
s = nums[i]+nums[left]+nums[right];
if(s==target) return s;
if(abs(s-target)<abs(ans-target)){
ans=s;
}
if(s<target) left++;
else right--;
}
}//for i
return ans;
}
};