题目传送门
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int l=0;
vector<vector<int>> vc;
sort(nums.begin(),nums.end());
if(nums.size()<2) return vc;
else{
for(int i=0;i<nums.size();i++)
{ if(nums[i]>0) break;//当在已经排序好了的数组中,如果当前数大于0,则后面就没有与之相加等于0的数了
map<int,int> mp;
int complent=-nums[i];
for(int j=i+1;j<nums.size();j++)
{ if(i!=0&&nums[i]==nums[i-1]) continue;//当数组在排序的情况下,如果连续的两个数相同,则必然会输出相同的结果
int k=complent-nums[j];
if(mp.find(k)!=mp.end())
{ while(j+1 <nums.size() && nums[j] == nums[j+1])//这一步是为了在比如[0,0,0,0]情况下,下标为2和3的0都可以找到key[2]而输出一样的结果
j++;
int a[]={nums[i],nums[j],-nums[i]-nums[j]};
vc.push_back({a[0],a[1],a[2]});
}
mp[nums[j]]=j;
}
}
return vc;
}
}
};
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> vc;
sort(nums.begin(), nums.end());
if(nums.size()<3) return vc;
else if (nums[0] <= 0 && nums[nums.size() - 1] >= 0)
{
int i = 0;
while (i < nums.size() - 2)
{
if (nums[i] > 0) break;
int frist = i + 1, last = nums.size() - 1;
while (frist < last)
{
if (nums[last] <0) break;
if (nums[i] + nums[frist] + nums[last] == 0)
{
vc.push_back({ nums[i],nums[frist],nums[last] });
frist++;
last--;
while(frist<last && nums[frist-1] == nums[frist]) //去重
frist++;
while(frist<last && nums[last+1] == nums[last]) //去重
last--;
}
else if (nums[i] + nums[frist] + nums[last] < 0)
{
frist++;
}
else
{
last--;
}
}
i++;
while (i+1<nums.size()&&nums[i] == nums[i - 1]) { i++; }
}
}
return vc;
}
};