思路:
1.先排序从小到大,记录第一个最小值前三个数的和ans
2.以每个数作为第一个数,然后从当前的下一个数(start下标)开始选第二个数,从最后一个数(end下标)开始倒数选第三个数求和sum
3.先更新当前最接近的值,ans与sum谁最接近target则更新作为ans
再判断走势,(1)如果ans==target,直接输出ans
(2)如果ans<target则start++,继续循环
(3)如果ans>target则end--,继续循环
代码如下:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
//先对数组进行排序,从小到大
sort(nums.begin(),nums.end());
int size=nums.size();
//初试的ans
int ans = nums[0] + nums[1] + nums[2];
//遍历每一个元素作为第一个数
for(int i=0;i<size;i++){
int start=i+1,end=size-1;
while(start<end){
int sum=nums[i]+nums[start]+nums[end];
//如果当前的和比之前的和与target相差较小,则更新ans的值
if(abs(sum-target)<abs(ans-target)){
ans=sum;
}
//如果当前的和等于target,直接输出即可
if(ans==target){
return ans;
}
//如果当前的和大于target,end--,对应的第三个数的值也会减小的
else if(sum>target){
end--;
//如果当前的和小于target,start++,对应的第二个数的值会增大的
}else{
start++;
}
}
}
//输出最接近的数
return ans;
}
};