LeetCode
tag == 数组
难度 == 中等
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
简而言之,与15类似。
排序双指针法。
思路:
1.排序
2.利用for循环确定第一个数的位置。之后的两个指针指向剩下的开头和结尾。begin==i+1;end=nums.size()-1;
3.这里与三数之和不同,我们需要一直记录delta值与对应的result。保留最小的delta值,见result输出。
理论基础:
当nums[begin]+nums[end]>target时,我们需要注意到如果右移begin,会让值不断的增大,使差值变大。只有右移end,才能时值减小。基本是省去判断nums[i+1n-1]+nums[end]的过程。n-1]的过程。
当 nums[begin]+nums[end]<target时,我们要左移end.基本是省去判断nums[begin]+nums[i+1
我们需要注意筛选出来的值都是有可能会出现的结果的组合,并不是一定就是最优的结果,我们需要注意保存全部的内容。
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int result=0;
int delta=65535;
int begin=0;
int end=0;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size()-2;i++)
{
begin=i+1;
end=nums.size()-1;
int temp=nums[i]+nums[begin]+nums[end];
while(begin<end)
{
temp=nums[i]+nums[begin]+nums[end];
if(abs(temp-target)<delta)
{
result=temp;
delta=abs(temp-target);
}
if((temp-target)>0)
{
end--;
}
else
{
if (temp-target==0)
{
return temp;
}
else
{
begin++;
}
}
}
}
return result;
}
};