先是采用了哈希表的做法,但是没有解决去重复的问题
哈希表做法代码(没有解决去重复的问题,未AC)
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
unordered_map<int,int> m;
vector<vector<int>> re;
int len = nums.size();
sort(nums.begin(),nums.end());
for(int i=0;i<len;i++)
{
if(nums[i]>0)
return re;
if(i>0&&nums[i-1]==nums[i])
continue;
int s=nums[i];
for(int j=i+1;j<len;j++)
{
if(nums[j-1]==nums[j])
continue;
if(m.find(nums[j])!=m.end())
{
vector<int> r;
r.push_back(s);
r.push_back(nums[j]);
r.push_back(m[nums[j]]);
re.push_back(r);
}else{
m[-s-nums[j]]=nums[j];
}
m.clear();
}
return re;
}
}
};
其他解法的话双指针的做法比较多,也相对比较容易解决去重复的问题
双指针做法(AC代码)
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int n=nums.size();
vector<vector<int>> re;
if(n<3)
return re;
sort(nums.begin(),nums.end());
for(int i=0;i<n;i++)
{
if(nums[i]>0)
return re;
if(i>0&&nums[i]==nums[i-1])
continue;
int L=i+1;
int R=n-1;
while(L<R)
{
if(nums[i]+nums[L]+nums[R]==0)
{
vector<int> r;
r.push_back(nums[i]); r.push_back(nums[L]); r.push_back(nums[R]);
re.push_back(r);
while(L<R&&nums[L]==nums[L+1])
L++;
while(L<R&&nums[R]==nums[R-1])
R--;
L++;
R--;
}
else if(nums[i]+nums[L]+nums[R]>0)
R--;
else
L++;
}
}
return re;
}
};