//give a target,find the closet three number,
//and compute the sum of the closet number
int threeClosetSum(int A[],int len,int target)
{
if (len < 3) return -1;
std::vector<int> v(A,A+len);
auto last = v.end();
std::sort(v.begin(), v.end());
int gap = 0;
int min_gap = __INT_MAX__;
int result;
for(auto a = v.begin(); a < std::prev(last,2); a++)
{
auto b = std::next(a);
auto c = std::prev(last);
while(b < c)
{
int sum = *a + *b + *c;
gap = abs(sum - target);
if(gap < min_gap)
{
min_gap = gap;
result = sum;
}
if(sum > target) c--;
else if(sum < target) b++;
else return target;
}
}
return result;
}
using std::vector;
std::vector<std::vector<int>> fourSum(int A[],int len,int target)
{
vector<vector<int>> result;
if(len < 4) return result;
vector<int> v(A,A+len);
std::sort(v.begin(), v.end());
std::unordered_map<int, vector<std::pair<int,int>>> cache;
for(auto a =0;a<v.size();a++)
{
for(auto b=a+1;b<v.size();b++)
{
cache[v[a]+v[b]].push_back(std::pair<int, int>(a,b));
}
}
for(auto c = 0;c<v.size();c++)
{
for(auto d = c+1;d<v.size();d++)
{
int key = target - v[c] - v[d];
if(cache.find(key) == cache.end()) continue;
auto& it = cache[key];
for(auto i = 0;i<it.size(); i++)
{
if (c <= it[i].second)
continue; // 有重叠
result.push_back({v[it[i].first],v[it[i].second],v[c],v[d]});
}
}
}
sort(result.begin(), result.end());
result.erase(std::unique(result.begin(),result.end()),result.end());
return result;
}
int main()
{
int A[] = {1,0,-1,0,-2,2};
vector<vector<int>> result = fourSum(A, 6, 0);
for(auto i =0;i<result.size();i++)
{
for(auto j : result[i])
{
std::cout << j << " ";
}
std::cout << std::endl;
}
return 0;
}
参考:http://pan.baidu.com/s/1i3vVPgp