描述
给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。
数据范围:0≤n≤3000,数组中各个元素值满足∣val∣≤100
空间复杂度:O(n2),时间复杂度 O(n2)
注意:
- 三元组(a、b、c)中的元素可以按任意顺序排列。
- 解集中不能包含重复的三元组。
示例1
输入:
[-10,0,10,20,-10,-40]返回值:
[[-10,-10,20],[-10,0,10]]
示例2
输入:
[-2,0,1,1,2]返回值:
[[-2,0,2],[-2,1,1]]
示例3
输入:
[0,0]返回值:
[]
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int>>ans;
sort(num.begin(),num.end());
//找出a+b+c=0
//a=num[i],b=num[left],c=num[right]
for(int i=0;i<num.size();i++){
if(num[i]>0)return ans;
//去重1
if(i>0 && num[i]==num[i-1]){
continue;
}
int left=i+1;
int right=num.size()-1;
while(left<right){
if(num[i]+num[left]+num[right]>0)
right--;
else if(num[i]+num[left]+num[right]<0)
left++;
else{
ans.push_back(vector<int>{num[i],num[left],num[right]});
//去重2
while(left<right && num[right]==num[right-1])
right--;
while(left<right && num[left]==num[left+1])
left++;
left++;
right--;
}
}
}
return ans;
}
};