#include<string>
#include<iostream>
#include<stack>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
int threeSumClosest(vector<int> &num, int target) {
sort(num.begin(), num.end());
const int N = num.size();
int minDis = INT_MAX;
int result = 0;
for (int i = 0; i < N; ++i)
{
if (i > 0 && num[i] == num[i - 1]) continue;
int s = i + 1, e = N - 1;
while (s < e)
{
int curSum = num[s] + num[e] + num[i];
int curDis = abs(curSum - target);
if (curDis < minDis)
{
minDis = curDis;
result = curSum;
}
if (curSum == target)
{
return target;
}
else if (curSum > target)
{
while (s < --e && num[e] == num[e + 1]);
}
else
{
while (++s < e && num[s] == num[s - 1]);
}
}
}
return result;
}
int threeSumClosest1(vector<int> &num, int target)
{
sort(num.begin(),num.end());
int i = 0;
int s, e, currentmin = INT_MAX, result=0;
for (i = 0; i < num.size(); i++)
{
s = i + 1;
e = num.size() - 1;
while (s<e)
{
int sum = num[i] + num[s] + num[e];
int abssum = abs(sum - target);
if (abssum < currentmin)
{
currentmin = abssum;
result = sum;
}
if (sum == target)
return target;
else if (sum > target)
{
e--;
while (num[e] == num[e + 1])
{
if (s < e)
{
e--;
}
else
{
break;
}
}
}
else
{
s++;
while (num[s] == num[s - 1])
{
if (s < e)
{
s++;
}
else
{
break;
}
}
}
}
}
return result;
}
int main()
{
vector<int> nums = { 100,50,20,-1, 2, 1, -4 };
int t = 1;
cout << threeSumClosest1(nums,t) << endl;
}
思路:先给数组内元素排序,选择一个元素num[i],对i下标的元素找开始和结尾下标,分别为s = i + 1, e = N - 1; 那么curSum = num[s] + num[e] + num[i]; 算出curSum和target的差值的绝对值,要是小于最小值,那么更新最小值。之后判断curSum和target的大小关系,若相等,则返回target,此时两者差值最小,为0;若curSum > target,则尾下标e自减,即curSum的值变小,这时判断num[e] == num[e + 1]是否成立,成立说明两者相等,即存在相同值,那么尾下标e还要继续自减,当两者不等时退出循环,且当s>=e时也要退出循环; curSum < target 的情况同理
原文:http://my.oschina.net/a20092173/blog/516839