思路:
由于他让求不包含重复的三元组,那么我们其实可以使用一个双指针来求,我们先把数组派个续,固定一端,然后从剩下的序列中开始进行枚举答案,即可。注意去重。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
if(nums.size()<3){
return {};
}
sort(nums.begin(),nums.end());
vector<vector<int>>ans;
for(int i=0;i<nums.size();i++){
if(i>0&&nums[i-1]==nums[i]){
continue;
}
int target=nums[i];
int l=i+1,r=nums.size()-1;
while(l<r){
if(l<r&&nums[l]+nums[r]+target>0){
r--;
}
if(l<r&&nums[l]+nums[r]+target<0){
l++;
}
if(l<r&&nums[l]+nums[r]+target==0){
ans.push_back({target,nums[l],nums[r]});
while(l<r&&nums[r]==nums[r-1]){
r--;
}
while(l<r&&nums[l]==nums[l+1]){
l++;
}
l++,r--;
}
}
}
return ans;
}
};