给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int threeSumOld, threeSumNew; //threeSumOld存放更初始的三数和,也存放最接近的target
//的三数和
//threeSumNew存放更新的三数和,两者用于比较,进行更新
threeSumOld = nums[0] + nums[1] + nums[2];
for(int first = 0; first<(int) nums.size()-2; first++)
{
int start = first + 1, end_num = (int) nums.size() - 1;
while(start < end_num)
{
threeSumNew = nums[first] + nums[start] + nums[end_num];
//如果更新的三数和更接近target,就把更新值赋值给初始值。用abs绝对值解决。
if(abs(threeSumNew - target) < abs(threeSumOld - target) )
{
threeSumOld = threeSumNew;
}
//如果更新值等于target,则直接返回target
if(threeSumNew == target)
{
return target;
}
//如果更新值大于target,说明第三个数应该往左移
else if(threeSumNew > target)
{
end_num--;
}else{//如果更新值小于target,说明第三个数应该往右移
start++;
}
}
}
return threeSumOld;
}
};
个人涂涂画画如下:
总结思路:for循环第一个数,将其暂时固定住,在第二个数下标小于第三个的时候,根据三数和进行第二个数的右移、第三个数的左移。