# 最接近的三数之和
给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
提示:
3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4
给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
提示:
3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4
以下错误的选项是?
## aop
### before
```cpp
#include
using namespace std;
```
### after
```cpp
int main()
{
Solution sol;
int arr[] = {-1, 2, 1, -4};
int target = 1;
int length1 = sizeof(arr) / sizeof(arr[0]);
vector nums(arr, arr + length1);
int res;
res = sol.threeSumClosest(nums, target);
cout << res;
return 0;
}
```
## 答案
```cpp
class Solution
{
public:
int threeSumClosest(vector &nums, int target)
{
if (nums.size() < 3)
;
runtime_error("No Solution");
sort(nums.begin(), nums.end());
int res = nums[0] + nums[1] + nums[2];
int dValue = abs(target - res);
int l, r, sum;
for (int i = 0; i < nums.size() - 2; ++i)
{
l = i + 1;
r = nums.size() - 1;
if (3 * nums[i] > target)
break;
while (l < r)
{
sum = nums[i] + nums[l] + nums[r];
if (sum < target)
--l;
else if (sum > target)
++r;
else
return target;
if (abs(target - sum) < dValue)
{
res = sum;
dValue = abs(target - sum);
}
}
}
return res;
}
};
```
## 选项
### A
```cpp
class Solution
{
public:
int threeSumClosest(vector &nums, int target)
{
int l = nums.size();
int best = nums[0] + nums[1] + nums[2];
for (int i = 0; i < l - 2; i++)
{
for (int j = i + 1; j < l - 1; j++)
{
for (int k = j + 1; k < l; k++)
{
int t = nums[i] + nums[j] + nums[k];
if (abs(t - target) < abs(best - target))
{
best = t;
}
}
}
}
return best;
}
};
```
### B
```cpp
class Solution
{
public:
int threeSumClosest(vector &nums, int target)
{
sort(nums.begin(), nums.end());
if (nums.size() < 3)
return {};
int closest = target + 10000000;
for (int i = 0; i < nums.size() - 2; i++)
{
int fix = nums[i];
if (fix > target && abs(fix + nums[i + 1] + nums[i + 2] - target) > abs(closest - target))
break;
for (int j = i + 1; j < nums.size() - 1; j++)
{
for (int k = j + 1; k < nums.size(); k++)
{
int temp = abs(target - fix - nums[j] - nums[k]);
if (temp < abs(closest - target))
closest = fix + nums[j] + nums[k];
}
}
}
return closest;
}
};
```
### C
```cpp
class Solution
{
public:
int threeSumClosest(vector &nums, int target)
{
int len = nums.size();
int min = target + 1000000;
sort(nums.begin(), nums.end());
for (int i = 0; i < len; i++)
{
int fir = nums[i];
int r = len - 1;
int l = i + 1;
if (i > 0 && fir == nums[i - 1])
continue;
if (l >= r)
break;
while (l < r)
{
if (nums[l] + nums[r] + fir == target)
return target;
if (nums[l] + nums[r] < target - fir)
{
int temp = target - fir - nums[r] - nums[l];
if (temp < abs(min - target))
min = nums[l] + nums[r] + fir;
l++;
}
else if (nums[l] + nums[r] > target - fir)
{
int temp = nums[l] + nums[r] + fir - target;
if (temp < abs(min - target))
min = nums[l] + nums[r] + fir;
r--;
}
}
}
return min;
}
};
```