class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
if (num.size() < 3)
return vector<vector<int> >();
vector<vector<int>> result;
sort(num.begin(),num.end());
for (int i = 0;i<num.size();i++)
{
int p = result.size();
int target = -num[i];
vector<int> new_num(num.begin()+i+1,num.end());
vector<int> sub_result;
map<int,int> mapping;
for (int j = 0;j<new_num.size();j++)
{
auto iter = mapping.find(target - new_num[j]);
if (iter != mapping.end())
{
sub_result.push_back(num[i]);
sub_result.push_back(new_num[iter->second]);
sub_result.push_back(new_num[j]);
}
mapping[new_num[j]] = j;
if (!sub_result.empty())
{
bool same(false);
for (auto r : result)
{
if (r == sub_result)
same = true;
}
if (!same)
result.insert(result.begin()+p,sub_result);
}
sub_result.clear();
}
}
return result;
}
};
选第一个数为target,转换为求剩余数组中和为target,即两数之和问题
由于有顺序要求,首先对数组排序,然后利用迭代器生成子数组,使用哈希表求出另外两个数,push_back的操作保证顺序要求。
为防止相同值,将新获得的数与之前的成员相比
由于哈希表寻找的值总是由大到小,所以子数组需要使用insert