class Solution {
public:
//求三数之和,从两数之和而来,一个循环固定一个数,循环内进行双指针:相当于求两数之和为第三数的相反值
//考虑重复问题,同样,未使用或者正在使用是可以使用本数的,而相同的数使用过了,这个数就不能使用了,标记且跳过;
vector<vector<int> > threeSum(vector<int>& num) {
if(num.size() < 3)return {}; //不能成组时,直接返回,不然在指针赋值时,超出数组
vector< vector<int> > ans = {};
sort(num.begin(), num.end());
vector<int> visit( num.size() , 0); //其实可以不用标记,在重复时,直接跳过即可
for(int i=0; i<num.size()-2; i++){
if(i>0 && num[i] == num[i-1] && visit[i-1] == 2){
visit[i] = 2;
continue;
}
visit[i] = 1;
int left = i+1;
int right = num.size()-1;
while(left < right){
if( num[left]==num[left-1] && visit[left-1]==2 ){
visit[left] = 2;
left++;
continue;
}
if( right < num.size()-1 && num[right]==num[right+1] && visit[right+1] ==2 ){
visit[right] = 2;
right--;
continue;
}
if(num[left] + num[right] == -num[i]){
ans.push_back({num[i], num[left], num[right]});
visit[left] = 2;
visit[right] = 2;
left++;
right--; //移动指针
}else if( num[left] + num[right] < -num[i] ){
left++;
}else if( num[left] + num[right] > -num[i] ){
right--;
}
}
std::fill(visit.begin()+i+1, visit.end(), 0); //清空记录
visit[i] = 2;
}
return ans;
}
};