您的位置:首页 > 其它

leetcode: 3SumClosest

2015-05-06 10:22 246 查看
题目:

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).


Hide Tags
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>!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: