题目:
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, 0, 1)
(-1, -1, 2)
思路:
首先进行排序,对于等式a+b+c=0,首先固定a,然后找到b与c其中,b+c=-a;将b定位在a的后面,c定位在容器的最后一个位置。然后b,c不断往里缩进。
1、算法:
sort(S); for i=0 to n-3 do a = S[i]; k = i+1; l = n-1; while (k<l) do b = S[k]; c = S[l]; if (a+b+c == 0) then output a, b, c; exit; else if (a+b+c > 0) then l = l - 1; else k = k + 1; end end end
2、细节调整:为防止重复出现,需要在算法中加入一些判定。因为已经经过排序操作,故重复输出必由重复数据出产生,对该部分做处理即可。处理方式,代码中已用红色标记给出
代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
vector<vector<int> > threeSum(vector<int>& nums) {
vector<vector<int> > result;
if(nums.size()<3) return result;
sort(nums.begin(),nums.end());
int a,b,c;
int j,k;
int n=nums.size();
for(int i=0;i<=n-3;i++)
{
a=nums[i];
if(a>0) break;//如果a大于0,则b,c,必大于0
<span style="color:#FF0000;">if(i>0 && nums[i]==nums[i-1])//防止重复
{
continue;
}</span>
j=i+1;
k=n-1;
while(j<k)
{
b=nums[j];
c=nums[k];
if(a+b+c==0)
{
<span style="color:#FF6666;">if(nums[j]==nums[j-1] && j>i+1)//防止重复
{
j++;
continue;
}</span>
vector<int > tmp;
tmp.push_back(a);
tmp.push_back(b);
tmp.push_back(c);
result.push_back(tmp);
j++;//找到一个满足条件的等式,继续寻找
}
else if(a+b+c>0)
{
k--;
}
else
{
j++;
}
}
}
return result;
}
};
int main()
{
Solution s;
int arr[]={-1,0,1,2,-1,-4};
vector<int> ivec(arr,arr+6);
vector<vector<int> > ret;
ret=s.threeSum(ivec);
for(auto iter=ret.begin();iter!=ret.end();++iter)
{
cout<<"("<<(*iter)[0]<<","<<(*iter)[1]<<","<<(*iter)[2]<<")"<<endl;
}
system("pause");
return 0;
}