题目
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
解题思路
主要利用双指针的思想来实现,首先对数组进行排序,然后固定住第i个元素,设置左指针的起始下标为i+1,右指针的起始下标为数组长度长度减1,如果nums[i]+nums[left]+nums[right]的值大于target,则令右指针左移一位;如果三数之和小于target,则令左指针右移一位;如果三数之和等于target,则直接返回三数之和即可。上述判断规则的前提是左指针下标始终要小于右指针。
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target)
{
sort(nums.begin(),nums.end());//对数组进行排序
//temp用于存储三数之和与target之间的差,ret用于存储三数之和
int temp=abs(nums[0]+nums[1]+nums[2]-target),ret=nums[0]+nums[1]+nums[2];
for(int i=0;i<nums.size()-1;i++)//遍历nums数组,固定住第i个元素
{
int left=i+1,right=nums.size()-1;//左指针下标从i+1开始,右指针的下标从最后一位开始
while(left<right)//保证左指针下标始终小于右指针下标
{
//先判断如果当前三数之和与target的差比先前的要小,则将前者赋值给后者
if(temp>abs(nums[i]+nums[left]+nums[right]-target))
{
temp=abs(nums[i]+nums[left]+nums[right]-target);
ret=nums[i]+nums[left]+nums[right];
}
//如果当前三数之和大于target
if(nums[i]+nums[left]+nums[right]>target)
{
right--;//令右指针左移一位
continue;//同时直接进行下轮循环
}
//如果当前三数之和小于target
if(nums[i]+nums[left]+nums[right]<target)
{
left++;//令左指针右移一位
continue;//同时直接进行下轮循环
}
//如果当前三数之和等于target
if(nums[i]+nums[left]+nums[right]==target)
{
return nums[i]+nums[left]+nums[right];//直接返回三数之和
}
}
}
return ret;
}
};