题目描述
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.
题目解析
最直接的是三重循环;
由于要求去掉重复的答案,所以要先对nums排序;
方法一是利用哈希表加快一点速度。
方法二是使用two-pointer法。
代码(哈希表)
class Solution {
public:
vector<vector<int> > threeSum(vector<int>& nums) {
vector<vector<int> >ans;
int cnt = nums.size();
if(cnt<3) //如果少于三个数返回空答案
{
return ans;
}
sort(nums.begin(),nums.end());//排序
unordered_map<int,int>nums_map;//利用map统计数字的出现频次
for(int i=0;i<cnt;++i)
{
nums_map[nums[i]]++;
}
vector<int>triple(3,0);
for(int i=0;i<cnt-2;++i)
{
if(i>0&&nums[i]==nums[i-1])//跳过nums[i]的重复
{
continue;
}
for(int j=i+1;j<cnt-1;++j)
{
if(j>i+1&&nums[j]==nums[j-1])//跳过nums[j]的重复
{
continue;
}
int k = -nums[i]-nums[j];
if(k<nums[j]||k>nums[j]&&nums_map.count(k)==0)//要求nums[i]<=nums[j]<=k
{
continue;
}
if(k==nums[j])//处理k==nums[j]的情况
{
if(k>nums[i]&&nums_map[k]==1||k==nums[i]&&nums_map[k]==2)
{
continue;
}
}
triple[0]=nums[i];
triple[1]=nums[j];
triple[2]=k;
ans.push_back(triple);
}
}
return ans;
}
};
代码(two-pointer)
class Solution {
public:
vector<vector<int> > threeSum(vector<int>& nums) {
vector<vector<int> >ans;
int cnt = nums.size();
if(cnt<3) //如果少于三个数返回空答案
{
return ans;
}
sort(nums.begin(),nums.end());//排序
vector<int>triple(3,0);
for(int i=0;i<cnt-2;++i)
{
if(i>0&&nums[i]==nums[i-1])//跳过nums[i]的重复
{
continue;
}
int j = i+1; //two-pointer法
int k = cnt-1;
while(j<k)
{
int sum = nums[i]+nums[j]+nums[k];
if(sum==0)
{
triple[0]=nums[i];
triple[1]=nums[j++];
triple[2]=nums[k--];
ans.push_back(triple);
while(j<k&&nums[j]==nums[j-1])
{
j++;
}
while(j<k&&nums[k]==nums[k+1])
{
k--;
}
}
else if(sum<0)
{
j++;
}
else
{
k--;
}
}
}
return ans;
}
};