1 题目描述
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
难度:Medium
2 题目样例
For example, given array S = {-1 2 1 -4}, and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
3 题目分析
题设和前一题3Sum比较相似,只有微小的不同:
- 保证只有一组最符合题意的返回值。
- 要返回的是其和与目标数字最接近的三个数,也就是说不一定保证存在三个数恰好之和等于目标数字。
4 思路分析
不仅仅是题设,思路上也和之前的3Sum基本一致。只要针对以下的部分,对3Sum的代码进行修改即可:
在类似于3Sum的遍历过程中,只要一直维护三数之和与目标数字的差值,并把差值最小的那组数据记录并返回即可。排序当然是有必要的了。
代码实现如下:
class Solution
{
public:
int threeSumClosest(vector<int> &num, int target)
{
int res = num[0] + num[1] + num[2];
std::sort(num.begin(), num.end());
for (int i = 0; i <=num.size(); i++)
{
int front = i + 1;
int back = num.size() - 1;
while (front < back)
{
int sum = num[i] + num[front] + num[back];
if (abs(sum - target) < abs(res - target))
res = sum;
if (sum < target)
front++;
else if (sum > target)
back--;
else
{
front++;
back--;
}
}
}
return res;
}
};
5 后记
kSum问题是一类问题,也是面试题中比较常见的题目。有兴趣的小伙伴,可以在做完3Sum的这两道题和4Sum之后,写一个非暴力算法的KSum问题通解出来。