题目:
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).Array Two Pointer
*******************************************************************************************************************************************************************
算法思想:还是跟前面 2Sum,3Sum的思想一样,先排序,再利用2个指针,一前一后;设三个数的和为sum;;最后返回的结果记为 ret; 每次得到一个sum时,比较 ret 和
sum 距离 target 的大小,更新ret;然后根据 sum 和 target 的大小来决定两个指针的移动。
具体的代码如下:
int threeSumClosest(vector<int>& nums, int target)
{
sort(nums.begin(), nums.end());// 排序
int len = nums.size();
int sum = 0; //中间过程的结果
int ret = 0; //要返回的结果
int l = 0, r = len-1;
bool first = true; // 判断是否是第一次计算sum的值
for (int i = 0; i < len - 2; ++i)
{
l = i + 1;
r = len - 1;
while (l < r)
{
sum = nums[i] + nums[l] + nums[r];
if (first)
{
ret = sum; //第一次计算sum的值的时候,用sum来初始化ret
first = false;
}
else
{ //比较上一次 ret 和这次计算的sum ,谁距离target更近;更新ret的值
if (abs(ret - target)>abs(sum - target))
ret = sum;
}
if (ret == target) //若ret和target相等,则返回ret的值
return ret;
if (sum < target) // 在遍历当前第i的元素时,若sum比target小,则左边的指针向右移动
{
++l;
}
if (sum>target)
{
--r;
}
}
}
return ret;
}
void main()
{
vector<int> nums = { 1, 2, 4, 8, 16, 32, 64, 128 };
int target = 82; // 2 16 64
int ret = threeSumClosest(nums, target);
cout << ret << endl;
}
<span style="font-size:18px;color:#cc0000;">已经将 2Sum,3Sum,3SumClosest 这几题都做完了,还有一道4Sum没做;其实这都是一类问题,等4Sum做完了,再来写一篇博文对这类题目进行下总结,嗯,记住</span>!