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.
For example, given array S = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]要求:不能有重复的组合
解题思路:
该题可以分解为一个数和twoSum之和为0的问题,从S中拿出一个数a,然后找另两个数b、c,这两个数b、c之和为-a。
附上代码:
#include <iostream>
#include <map>
#include <vector>
using namespace std;
class Solution
{
public:
vector<vector<int> > threeSum(vector<int>& nums)
{
sort(nums.begin(),nums.end());// 先排序
vector<vector<int> > result;
vector<int> nums_copy(nums);
int m = nums[0];
int prev;
for(int i=1; i<nums.size(); i++)
{
if(m!=prev)
{
vector<vector<int> > ret;
nums_copy.erase(nums_copy.begin());
ret=twoSum(nums_copy,m);
if(ret.size()!=0)
{
for(int j=0; j<ret.size(); j++)
{
ret[j].push_back(m);
result.push_back(ret[j]);
}
}
m=nums[i];
prev=nums[i-1];
}
}
return result;
}
vector<vector<int> > twoSum(vector<int> &a,int b)
{
int target = 0-b;
map<int,int> hash;
vector<vector<int> > result;
for(int i=0; i<a.size(); i++)
{
if(hash.find(target-a[i])!=hash.end())
{
vector<int> ret;
ret.push_back(target-a[i]);
ret.push_back(a[i]);
result.push_back(ret);
}
hash[a[i]]=i;
}
return result;
}
};
int main()
{
int n;
cin>>n;
vector<int> nums;
vector<vector<int> > result;
for(int i=0; i<n; i++)
{
int r;
cin>>r;
nums.push_back(r);
}
Solution s;
result=s.threeSum(nums);
for(int i=0; i<result.size(); i++)
{
for(int j=0; j<result[i].size(); j++)
{
cout<<result[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
代码时间复杂度应该为O(n^2),提交时,显示Runtime Error,等下次再刷优化一下代码!
有更好算法的大神可以指正,谢谢!