vector<vector<int>> threeSum(vector<int>& nums) {
// 需要用到双指针游标,left、right更加快捷
std::sort(nums.begin(), nums.end());
std::vector<std::vector<int>> vec;
for (int i = 0; i<nums.size(); i++) {
// 排序后,若i元素大于0,后面都大于0,不可能相加等于0,所以return
if (nums[i] > 0) return vec;
// 去除i的重复值,因为排序了,所以可以根据num[i]==num[i-1]判断,否则会导致返回vec中出现重复的数组
if (i>0 && nums[i] == nums[i-1]) continue;
int l = i+1;
int r = nums.size()-1;
while(l < r) {
if (nums[i] + nums[l]+ nums[r] == 0) {
vec.push_back({nums[i], nums[l], nums[r]});
// 也要出去l和r的重复值
while(l<r && nums[r] == nums[r-1]) r--;
while(l<r && nums[l] == nums[l+1]) l++;
l++;
r--;
}
else if (nums[i] + nums[l]+ nums[r] < 0) {
l++;
}
else // >0
{
r--;
}
}
}
return vec;
}