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; } };