给定一个包含 n 个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]
思路:双指针,对每个i确定的值,相当于求两个数的和等于nums[i]的负值,转化为两数之和。开始时两个指针分别为l=i+1和r=size()-1,如果满足nums[i]等于两个指针的量之和,则加入结果。并且判断nums[l+1]等于nums[il,则l++,nums[r]==nums[r-1],则r--;这就是跳过重复的步骤。若两者和不满足,同上进行去重复步骤。
class Solution {
public:
vector> threeSum(vector& nums) {
vector> res;
if(nums.size()<3) return res;
sort(nums.begin(),nums.end());
for(int i=0;i0&&nums[i]!=nums[i-1]))
{
int l=i+1,r=nums.size()-1,sum=0-nums[i];
while(l v={nums[i],nums[l],nums[r]};
res.push_back(v);
while(l
下边是超时代码,思路是原数组分成正负数组,则三个数等于,即必有一个负数和两个负数以及全是0三种情况,计算过程也是将三数之和化成两数之和,分别计算并去重复。
class Solution {
public:
vector> threeSum(vector& nums) {
vector> res;
vector fu,zh;
int n=nums.size();
int coun=0; //0的个数
if(n<3) return res;
//sort(nums.begin(),nums.end());
for(int i=0;i=3) {
vector v={0,0,0};
res.push_back(v);
}
map m;
for(int i=0;i::iterator it=m.find(factor);
if(it!=m.end() && it->second!=j)
{
vector v={-target,it->first,zh[j]};
sort(v.begin(),v.end());
res.push_back(v);
}
m.insert(pair(zh[j],j));
}
}
//
m.erase(m.begin(),m.end());
for(int i=0;i::iterator it=m.find(factor);
if(it!=m.end() && it->second!=j) {
vector v={-target,it->first,fu[j]};
sort(v.begin(),v.end());
res.push_back(v);
}
m.insert(pair(fu[j],j));
}
}
sort(res.begin(),res.end());
res.erase(unique(res.begin(),res.end()),res.end());
return res;
}
};