方法1:排序+vector中count函数(会超时)
vector的count()函数用法如下:(突然发现是男朋友的博客hhh,浅秀一波~)
【C++STL】vector的count()和count_if()函数的用法_Joseph_L_的博客-CSDN博客_vector.count
//会超时!
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int len=nums.size();
vector<vector<int>> ans;
sort(nums.begin(),nums.end());
for(int i=0;i<len;i++)
{
if(nums[i]>0)
break;
for(int j=i+1;j<len;j++)
{
if(nums[i]+nums[j]>0)
break;
for(int k=j+1;k<len;k++)
{
if(nums[i]+nums[j]+nums[k]==0)
{
vector<int> tmp;
tmp.push_back(nums[i]);
tmp.push_back(nums[j]);
tmp.push_back(nums[k]);
if(!count(ans.begin(),ans.end(),tmp))
ans.push_back(tmp);
}
}
}
}
return ans;
}
};
方法二:排序+双指针
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int len=nums.size();
vector<vector<int>> ans;
sort(nums.begin(),nums.end());
for(int i=0;i<len;i++)
{
if(nums[i]>0)
break;
if(i!=0&&nums[i]==nums[i-1])//需要和上一次枚举的数不相同
continue;
int target=-nums[i];
int k=len-1;// c 对应的指针初始指向数组的最右端
for(int j=i+1;j<len;j++)
{
if(nums[i]+nums[j]>0)
break;
if(j!=i+1&&nums[j]==nums[j-1])// 需要和上一次枚举的数不相同
continue;
while(j<k&&nums[j]+nums[k]>target)// 需要保证 b 的指针在 c 的指针的左侧
k--;
if(j==k)
break;//在当前i下不再会有满足条件的解了,break出循环;如果指针重合,随着b 后续的增加
// 就不会有满足a+b+c=0并且b<c的c了,可以退出循环
if(nums[j]+nums[k]==target)//这个要在前面j==k的判断条件之后!
{
vector<int> tmp;
tmp.push_back(nums[i]);
tmp.push_back(nums[j]);
tmp.push_back(nums[k]);
ans.push_back(tmp);
}
}
}
return ans;
}
};