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.
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).
本题和3Sum那道题类似,不同点在于需要计算与目标值的差距。
功能测试用例:{ -1, 2, 1, -4 },4特殊测试用例:{},0;{0},0;{0,0},0
class Solution
{
public:
void FastSort(vector<int> &vsNumber, int nBegin, int nEnd)//快速排序
{
if (nBegin >= nEnd)
return;
int nPos1 = nBegin;
int sNMiddle = vsNumber[nEnd], sNChange;
for (int nPos2 = nBegin; nPos2 < nEnd; nPos2++)
{
if (vsNumber[nPos2] < sNMiddle)
{
sNChange = vsNumber[nPos1];
vsNumber[nPos1] = vsNumber[nPos2];
vsNumber[nPos2] = sNChange;
nPos1++;
}
}
vsNumber[nEnd] = vsNumber[nPos1];
vsNumber[nPos1] = sNMiddle;
FastSort(vsNumber, nBegin, nPos1 - 1);
FastSort(vsNumber, nPos1 + 1, nEnd);
}
int threeSumClosest(vector<int> &num, int target)
{
if (num.size() < 3)
return NULL;
int nResult = NULL,nRemain,nBegin,nEnd,nClosest = INT32_MAX,nAbs;
FastSort(num,0,num.size()-1);//对输入的向量中元素进行排序
for (int nTemp = 0; nTemp < num.size() - 2; nTemp++)//遍历向量中的元素
{
nRemain = target - num[nTemp];//计算出减去当前值后的剩余值
nBegin = nTemp + 1;
nEnd = num.size() - 1;
while (nBegin < nEnd)
{
nAbs = abs(num[nBegin] + num[nEnd] - nRemain);//计算与目标值差值的绝对值
if (nAbs < nClosest)//与最小绝对值进行比较
{
nClosest = nAbs;
nResult = num[nBegin] + num[nEnd] + num[nTemp];
}
if (num[nBegin] + num[nEnd] < nRemain)
{
nBegin++;
}
else if (num[nBegin] + num[nEnd] > nRemain)
{
nEnd--;
}
else
{
return target;
}
}
}
return nResult;
}
};