您的位置:首页 > 其它

leetcode: 3Sum Closest

2013-05-18 23:59 330 查看
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).

下面的方法对large judge超时,需要再想一种更高效的方法

#define MAX_CLOSEST 10000

class Solution {
void foo(int *array, int len, int remainNum, int &curSum, int &closeSum, int &target)
{
if (remainNum == 0)
{
if (abs(curSum - target) < abs(closeSum - target))
{
closeSum = curSum;
}
return;
}

for (int i = 0; i<len; i++)
{
curSum += array[i];
foo(&array[i+1], len-i-1, remainNum-1, curSum, closeSum, target);
curSum -= array[i];
}
}

public:
int threeSumClosest(vector<int> &num, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int closeSum = MAX_CLOSEST;
int vectorSize = num.size();
int curSum = 0;

for (int i = 0; i<vectorSize; i++)
{
foo(&num[i], vectorSize-i, 3, curSum, closeSum, target);
}

return closeSum;
}
};


网上其他人的算法,主要是基于先对数组进行排列,然后再进行相加比较 转自 http://blog.csdn.net/leo524891010/article/details/8246317

class Solution {
public:
int threeSumClosest(vector<int> &num, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
sort(num.begin(), num.end());
int res = 0;
int diff = INT_MAX;

for (int i = 0; i < num.size(); ++i)
{
int j = i + 1;
int k = num.size() - 1;

int tempSum = 0;
while (j < k)
{
tempSum = num[i] + num[j] + num[k];
if (tempSum == target)
return target;
else if (tempSum > target)
{
if (diff > tempSum - target)
{
diff = tempSum - target;
res = tempSum;

}
k--;
}
else if (tempSum < target)
{
if (diff > target - tempSum)
{
diff = target - tempSum;
res = tempSum;

}
j++;
}
}
}

return res;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: