给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
本题只需要对上一题求三数之和进行少许的修改即可。
思路:仍采用双指针的思路,只不过需要记录每次移动过程中出现的最近的值
#include<vector>
#include<algorithm>
using namespace std;
class Solution
{
public:
int ThreeSumClosest(vector<int>& nums, int target)
{
int n = nums.size();
if (n<3)
{
return NULL;
}
if (n==3)
{
return nums[0] + nums[1] + nums[2];
}
sort(nums.begin(), nums.end());
int MinSum = INT_MAX;
int ans = 0, tmpSum = 0;
for (int i = 0; i < n;i++)
{
int l = i + 1, h = n - 1;
while (l<h)
{
tmpSum = nums[l] + nums[i]+nums[h];
//判断并记录最近的距离和该情况下的三数之和
if (abs(tmpSum-target) < MinSum)
{
MinSum = abs(tmpSum - target);
ans = tmpSum;
}
if (tmpSum < target)
{
l++;
}
else if (tmpSum>target)
{
h--;
}
else
{
return ans;
}
}
}
return ans;
}
};