给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
这个题和三数之和那个题基本一样,甚至思想更简单了一些,只需要设置一个差值,每次三数相加时对比差值,如果更小就保存三数之和,而且这个题不需要去掉重复项,遍历的思路还是一样,先排序,然后逐个遍历,利用双指针将之后剩余数都遍历一遍算加和再比价差值即可。
C++源代码:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int res = nums[0]+nums[1]+nums[2];
int diff = abs(res-target);
sort(nums.begin(), nums.end());
for (int k=0;k<nums.size()-2;k++)
{
int i = k+1;
int j = nums.size()-1;
while (i<j)
{
int sum = nums[k] + nums[i] + nums[j];
if (abs(sum-target) < diff)
{
diff = abs(sum-target);
res = sum;
}
if (sum<target) i++;
else j--;
}
}
return res;
}
};
python3源代码:
class Solution:
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
res = sum(nums[0:3])
diff = abs(res-target)
nums.sort()
for k in range(len(nums)-2):
i = k+1
j = len(nums)-1
while i<j:
threeSum = nums[k] + nums[i] + nums[j]
if abs(threeSum-target)<diff:
diff = abs(threeSum-target)
res = threeSum
if threeSum<target:
i += 1
else:
j -= 1
return res