class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int len = nums.size();
vector<vector<int>> ans;
// 数组长度小于3就不用算三数之和了
if(len < 3) return ans;
sort(nums.begin(), nums.end());
for(int i = 0; i < len; ++i){
// nums是排好序的,如果nums[i]大于0那么后边所有数都大于0,不可能找到三数之和等于0
if(nums[i] > 0) return ans;
if(i > 0 && nums[i] == nums[i - 1]) continue; // 去除重复解
int left = i + 1, right = len - 1;
while(left < right){
if(nums[i] + nums[left] + nums[right] == 0){
ans.push_back({nums[i], nums[left], nums[right]});
while(left < right && nums[left] == nums[left + 1]) left++; // 去除重复解
while(left < right && nums[right] == nums[right - 1]) right--; // 去除重复解
left++; // 去除重复解之后也要进行下一轮选择
right--;
}else if(nums[i] + nums[left] + nums[right] > 0) right--;
else left++;
}
}
return ans;
}
};