读题心路历程:感觉这道题和上一道题15题差不多,可以用相同的方式进行解题,先排序,确保数组顺序是从小到大的,与15题不同的地方就是,这道题中是求和target最接近的数组中三个数字的和,所以也就是说明,需要建立一个存和的临时变量,用来不停的计算与target的差值,等这个差值最小的时候,就可以return 这个和。
具体代码:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int resNum = nums[0]+ nums[1]+ nums[2];//定义一个和,用于最后返回的,可以最开始给一个初始值,用来比较出最接近target
for (int i = 0; i < nums.size(); i++)
{
if (i > 0 && nums[i] == nums[i-1])
{
continue;
}
int left = i + 1;
int right = nums.size() - 1;
while (left<right)
{
int curNum = nums[i] + nums[left] + nums[right];
if (curNum==target){ return target; }
int tmpNum = target - curNum;
if (abs(tmpNum)<abs(target-resNum))//关键代码就是这一小块,谁更接近target就让resNum 等于谁。
{
resNum = curNum ;
}
if (curNum>target)
{
while (right > left && nums[right] == nums[right - 1]) { right--;}
right--;
}
else
{
while (right > left && nums[left] == nums[left + 1]) { left++; }
left++;
}
}
}
return resNum;
}