给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
如果你理解了算法15的思想,相信这道题也是可以成功写出的。
方法一:双指针法
思路:与三数之和为0的思路类似,时间复杂度O(nlogn),空间复杂度O(logn)
【1】目标a+b+c最接近target,只要比较新增的sum=a+b+c与之前的min的大小。即abs(sum-target)?abs(min-target)大小
【2】先对数组进行排序
【3】对数组进行for循环,a=nums[i]
【4】使用双指针对a之后的数组进行遍历,并与现有的最接近值进行比较。
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end()); //排序
int min = nums[0] + nums[1] + nums[2]; //初始化最接近的值
for (int i = 0;i <= nums.size() - 3;++i) {
int begin = i + 1, end = nums.size() - 1; //双指针
while (begin < end) {
int sum = nums[i] + nums[begin] + nums[end]; //a+b+c
if (sum == target) { //存在a+b+c=target,必定为最接近的值
return target;
}
else {
if (abs(min - target) > abs(sum - target)) //与现有最接近值进行比较
min = sum;
if (sum < target) {
++begin;
}
else {
--end;
}
}
}
}
return min;
}