16. 最接近的三数之和
题目链接:16. 最接近的三数之和
代码如下:
class Solution
{
public:
int threeSumClosest(vector<int>& nums, int target)
{
sort(nums.begin(),nums.end());
int res;
int min_diff=INT_MAX;
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)// 后面无论怎么选,选出的三个数的和不会比 s 还小
{
if(s-target<min_diff)
{
res=s;// 由于下面直接 break,这里无需更新 min_diff
}
break;
}
// 优化二
s=nums[i]+nums[nums.size()-1]+nums[nums.size()-2];
if(s<target)// nums[i] 加上后面任意两个数都不超过 s,所以下面的双指针就不需要跑了
{
if(target-s<min_diff)
{
min_diff=target-s;
res=s;// 由于下面直接 break,这里无需更新 min_diff
}
continue;
}
//双指针
int left=i+1,right=nums.size()-1;
while(left<right)//对后两个元素用双指针法
{
s=nums[i]+nums[left]+nums[right];
if(s==target)
{
return target;
}
if(s>target)
{
if(s-target<min_diff)
{
min_diff=s-target;
res=s;
}
right--;
}
else
{
if(target-s<min_diff)
{
min_diff=target-s;
res=s;
}
left++;
}
}
}
return res;
}
};