主要就是利用左右指针把O(n3)降到O(n2)
剩下的就想办法排除重复
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ts;//返回
int m = nums.size();//长度
if(m < 3) return{};//排除不足3
sort(nums.begin(),nums.end());//排序
for(int i = 0;i < m&&nums[i] <= 0;i++){//n
if(i > 0&& nums[i] == nums[i-1])//排除重复
continue;
int n=i+1;//左指针
int tm=m-1;//右指针
//n^2
while(n<tm){//左右指针 判断+排除重复
if(nums[i]+nums[n]+nums[tm]>0||tm<m-1&&nums[tm]==nums[tm+1]){//
tm--;
continue;
}
else if(nums[i]+nums[n]+nums[tm]<0||n>i+1&&nums[n]==nums[n-1]){
n++;
continue;
}
if(nums[i]+nums[n]+nums[tm]==0){
ts.push_back({nums[i],nums[n],nums[tm]});
n++;
tm--;
}
}
}
return ts;
}
};