Given an array S of n integers, are there elements a,b,c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
- Elements in a triplet (a,b,c) must be in non-descending order. (ie,a ≤b ≤ c)
- The solution set must not contain duplicate triplets.
For example, given array S = {-1 0 1 2 -1 -4}, A solution set is:(-1, -1, 2)(-1, 0, 1)
注意输出的次序是由小到大。首先比较的是第一个数。然后第二个数。
说一下大致思路:
先求出两数之和S,再利用hash表查看一下是否有-s在数组中存在。如果有,并且位置与前面两数不同。则放入结果中。
注意的是,在每个三元组中,每个位置的数只能用一次。
重复的三元组不用多次输出,比如0 0 0 0 0 0输出0 0 0 就可以了。
然后就是注意排序。
粘个代码。
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <ext/hash_map>
using namespace std;
using namespace __gnu_cxx;
class node
{
public:
int x[3];
void sort() { std::sort(x, x + 3);}
node(){memset(x, 0, sizeof(x));}
node(const node &n) { (*this) = n; }
node &operator = (const node &n)
{
x[0] = n.x[0]; x[1] = n.x[1]; x[2] = n.x[2];
return (*this);
}
bool operator == (const node &a) const
{
return x[0] == a.x[0] && x[1] == a.x[1] && x[2] == a.x[2];
}
bool operator < (const node &a) const
{
if (x[0] < a.x[0]) return true;
if (x[0] > a.x[0]) return false;
if (x[1] < a.x[1]) return true;
if (x[1] > a.x[1]) return false;
if (x[2] < a.x[2]) return true;
return false;
}
};
class Solution
{
private:
vector<vector<int> > m_matrix;
set<node> m_set;
public:
vector<vector<int> > &threeSum(vector<int> &vs)
{
node x;
m_set.clear();
vector<int> v;
m_matrix.clear();
hash_map<int, vector<int> > rec;
for (int i = 0; i < vs.size(); ++i){
hash_map<int, vector<int> >::iterator iter = rec.find(vs[i]);
if (rec.end() == iter){
v.clear(); v.push_back(i);
rec.insert(pair<int, vector<int> >(vs[i], v));
} else {
iter->second.push_back(i);
}
}
for (int i = 0; i < vs.size(); ++i){
for (int j = i + 1; j < vs.size(); ++j){
const int s = vs[i] + vs[j];
hash_map<int, vector<int> >::iterator iter = rec.find(-s);
if (rec.end() != iter){
for (int k = 0; k < iter->second.size(); ++k){
const int t = (iter->second)[k];
if (t != i && t != j){
x.x[0] = vs[i]; x.x[1] = vs[j]; x.x[2] = vs[t];
x.sort();
m_set.insert(x);
}
}
}
}
}
for (set<node>::iterator iter = m_set.begin(); iter != m_set.end(); ++iter){
vector<int> x(iter->x, (iter->x)+3);
m_matrix.push_back(x);
}
return m_matrix;
}
void printf()
{
for (int i = 0; i < m_matrix.size(); ++i){
for (int j = 0; j < m_matrix[i].size(); ++j){
cout << m_matrix[i][j] << ",";
}
cout << endl;
}
}
};
我这里用的是Dev C++。能够在Leetcode上提交通过。