思路:借助双指针对枚举进行优化。如果pb,pc当前指向元素大于target,则将pc向左移动,因为以pc为第三个数的指针的pa,pb,pc已经指向最接近target的值。如果小于target,则将pb向右移动,因为以pb为第二个数指针的当前三指针已经达到最接近target。
即
如果 a+b+c≥target,那么就将 pc 向左移动一个位置;
如果 a+b+c<target,那么就将 pb 向右移动一个位置。
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int len=nums.size();
int result;
int distance_cur=INT_MAX;
for(int i=0;i<len-2;i++)
{
if(i>0&&nums[i-1]==nums[i])
continue;
int third=len-1;
int second=i+1;
while(second<third)
{
if(nums[i]+nums[second]+nums[third]==target)return target;
if(nums[i]+nums[second]+nums[third]-target>0)
{
int third_temp=third-1;
if(nums[i]+nums[second]+nums[third]-target<distance_cur)
{
result=nums[i]+nums[second]+nums[third];
distance_cur=nums[i]+nums[second]+nums[third]-target;
}
while(second<third_temp&&nums[third_temp]==nums[third])
third_temp--;
third=third_temp;
}
else
{
int second_temp=second+1;
if(target-nums[i]-nums[second]-nums[third]<distance_cur)
{
result=nums[i]+nums[second]+nums[third];
distance_cur=target-nums[i]-nums[second]-nums[third];
}
while(second_temp<third&&nums[second_temp]==nums[second])
second_temp++;
second=second_temp;
}
}
}
return result;
}
};