题目大意
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
解题思路
思路同上一题三数之和。
采用三指针方式,首先固定指针i,然后在i+1~end范围内采用双指针进行遍历,同时有一个全局变量负责记录当前最小差值以及当前最接近的值。
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
vector<vector<int>>ans;
int diff = INT_MAX, res = 0, tmp = 0;
for (int i = 0; i < nums.size(); i++)
{
//这里仅仅为了去重,相当于剪枝(可有可无)
if (i == 0 || nums[i] != nums[i - 1])
{
int left = i + 1, right = nums.size() - 1;
while (left < right)
{
tmp = nums[i] + nums[left] + nums[right] - target;
//如果差值小于当前最小值,则更新
if (abs(tmp) < diff){
diff = abs(tmp);
res = nums[i] + nums[left] + nums[right];
}
//如果差值大于0,向左移动right
if (tmp > 0)
--right;
//如果差值小于0,向右移动left
else if (tmp < 0)
++left;
//如果差值等于0,表明当前三数之和等于目标值,直接返回即可
else
return res;
}
}
}
return res;
}
};