想法:先排序,先考虑0的情况(三个以上连续的0),再考虑绝对值相同的数值,再考虑不包括0的情况,两个正数和为一个负数,或者两个负数的和为一个正数。这样的结果会包含重复的元素,最后再去掉重复的。提交时自己写的针对容器的容器去重和排序在本地VS2008下编译通过,但是提交不通过,去掉自己的比较函数,直接去重居然也好使,通过了。
// LeetCode_3Sum.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool lessthan(const vector<int> &vec1,const vector<int> &vec2)
{
return vec1[0]<vec2[0];
}
bool equal(const vector<int> &vec1,const vector<int> &vec2)
{
int lenvec1 = vec1.size();
int lenvec2 = vec2.size();
if (lenvec1 != lenvec2)
return false;
for (int i=0;i<lenvec2;i++)
{
if (vec1[i] != vec2[i])
{
return false;
}
}
return true;
}
vector<vector<int> > threeSum(vector<int> &num) {
int numlen = num.size();
sort(num.begin(),num.end());//sort(num.begin(),num.end(),less<int>())
bool flag;
vector<vector<int>> ret;
vector<int> retelem;
vector<int>::iterator pos = find(num.begin(),num.end(),0);
vector<int>::iterator conterpos;
if (pos == num.end())
flag = false;
else
flag = true;
if (flag)
{
vector<int>::iterator iterzero = find(num.begin(),num.end(),0);
if(iterzero+2<num.end()&&*(iterzero+2)==0)
{
retelem.push_back(0);
retelem.push_back(0);
retelem.push_back(0);
ret.push_back(retelem);
retelem.clear();
}
vector<int>::iterator iter = num.begin();
while(iter!=pos)
{
conterpos = find(pos,num.end(),-*iter);
if (conterpos!=num.end())
{
retelem.push_back(*iter);
retelem.push_back(0);
retelem.push_back(-*iter);
ret.push_back(retelem);
retelem.clear();
}
iter++;
}
}
vector<int>::iterator iteredge = num.begin();
while(iteredge!=num.end()&&*iteredge<0) iteredge++;
if (iteredge==num.begin()||iteredge==num.end())
{
return ret;
}
vector<int>::iterator iter1front = num.begin();
vector<int>::iterator iter2front = iteredge;
vector<int>::iterator iter1back,iter2back;
while (iter1front != iteredge)
{
iter1back = iteredge;
iter2back = num.end()-1;
while(iter1back<iter2back)
{
if (*iter1back + *iter2back == -*iter1front)
{
retelem.push_back(*iter1front);
retelem.push_back(*iter1back);
retelem.push_back(*iter2back);
ret.push_back(retelem);
retelem.clear();
iter2back--;
iter1back++;
}
else
{
if (*iter1back + *iter2back > -*iter1front)
iter2back--;
else
iter1back++;
}
}
iter1front++;
}
iter1back = iteredge;
while(iter1back != num.end())
{
iter1front = num.begin();
iter2front = iteredge-1;
while(iter1front<iter2front)
{
if (*iter1front + *iter2front == -*iter1back)
{
retelem.push_back(*iter1front);
retelem.push_back(*iter2front);
retelem.push_back(*iter1back);
ret.push_back(retelem);
retelem.clear();
iter1front++;
iter2front--;
}
else
{
if (*iter1front + *iter2front > -*iter1back)
iter2front--;
else
iter1front++;
}
}
iter1back++;
}
sort(ret.begin(),ret.end());//sort(ret.begin(),ret.end(),lessthan);
ret.erase(unique(ret.begin(),ret.end()),ret.end());//ret.erase(unique(ret.begin(),ret.end(),equal),ret.end());
return ret;
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> vec;
vec.push_back(-1);//{-1 0 1 2 -1 -4}
vec.push_back(0);
//vec.push_back(0);
//vec.push_back(0);
vec.push_back(0);
vec.push_back(1);
vec.push_back(2);
vec.push_back(-1);
vec.push_back(-4);
vector<vector<int> > ret;
ret = threeSum(vec);
int retlen = ret.size();
for (int i=0;i<retlen;i++)
{
for(int j=0;j<ret[i].size();j++)
cout<<ret[i][j]<<" ";
cout<<endl;
}
system("pause");
return 0;
}