// left是当前可用的左括号数,right是当前可用的右括号数,思路就是从左到右地找每一种可能。
// 当前,如果left==right的话,下一个字符一定只能是“(”
//如果left<right并且都大于0,下一个字符有两种可能
//如果left=0而right还有,下一个字符只能是“)”
//当left==right==0时,递归终点,完成了一个串的构造,把它放入result中。
//beats 100%,0.00ms。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> result;
for(int i=0;i<nums.size();i++){
if(nums[i]>0) break;
if(i>0 && nums[i]==nums[i-1]) continue;
int left=i+1,right=nums.size()-1;
while(left<right){
int sum=nums[left]+nums[right]+nums[i];
if(sum>0){
right--;
}
else if(sum<0){
left++;
}
else{
result.push_back({nums[i],nums[left],nums[right]});
int l=nums[left];
int r=nums[right];
while(left<right&&nums[left]==l) left++;
while(right>left&&nums[right]==r) right--;
}
}
}
return result;
}
};