思路:藉助雙指針對枚舉進行優化。如果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;
}
};