- 最接近的三数之和
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
这道题可以先对数组排序,然后使用双指针来解决。
具体解法为使用for循环遍历每一个元素i,在for循环内使用双指针j,k分别指向i+1以及数组最后一个元素,若三个元素和小于目标值,则让j++;否则k–;
本题目还可以在上述基础上继续优化,在每一个for循环中首先计算其对应的最小三数之和(nums[i]+nums[i+1]+nums[i+2])与最大三数之和(nums[i]+nums[len-2]+nums[len-1]),若最小三数之和大于target或者最大三数之和小于target,则不需要继续变化j,k。
执行用时 :4 ms, 在所有 C++ 提交中击败了99.33%的用户
内存消耗 :6.6 MB, 在所有 C++ 提交中击败了100.00%的用户
具体解法如下:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int min=INT_MAX;
int num=-1;
int len=nums.size();
for(int i=0;i<len-2;i++)
{
int num_min=nums[i]+nums[i+1]+nums[i+2];
int num_max=nums[i]+nums[len-2]+nums[len-1];
if(num_min>target)
{
if(min>num_min-target)
{
min=num_min-target;
num=num_min;
}
continue;
}
if(num_max<target)
{
if(min>target-num_max)
{
min=target-num_max;
num=num_max;
}
continue;
}
int j=i+1;
int k=len-1;
while(j<k)
{
int value=nums[i]+nums[j]+nums[k]-target;
int num_temp=nums[i]+nums[j]+nums[k];
if(value==0)
return target;
else if(value<0)
{
value=-value;
if(min>value)
{
min=value;
num=num_temp;
}
j++;
}
else
{
if(min>value)
{
min=value;
num=num_temp;
}
k--;
}
}
}
return num;
}
};