题目描述:
给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
思路:
先从小到大排序,然后定三个索引,i = 0, j = i+1, k = nums.size() -1,以i 为基准,向右移动 j 或者向左移动 k,找到最接近目标的和,如果和小于target, 则为了增大和,向右移动 j, 反之,向左移动 k
C++代码:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int closest = nums[0] + nums[1] + nums[2]; // 结果
int diff = abs(closest - target);
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size() - 2; ++i) { // i为基准
int left = i + 1, right = nums.size() - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
int newDiff = abs(sum - target);
if (diff > newDiff) { // 找到差异更小的,更新,并记录结果
diff = newDiff;
closest = sum;
}
if (sum < target) ++left; // 和如果小于target,则为使和更大,移动left
else --right; // 和如果大于target,则为使和更小,移动right
}
}
return closest;
}
};