class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
if (nums.empty())
return ans;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i++) {
if (i > 0 && nums[i] == nums[i-1])
continue;
int left = i + 1, right = nums.size()-1;
while (left < right && nums[left] == nums[left+1])
left++;
while(left < right && nums[right] == nums[right-1])
right--;
if (nums[i] + nums[right] + nums[left] == 0) {
ans.push_back({nums[i], nums[left], nums[right]});
left++;
right--;
} else if (nums[i] + nums[right] + nums[left] > 0) {
right--;
} else left++;
}
return ans;
}
};
上面这种方法是错误的,就拿上面的这种方法来说,在【-4,-1,-1,0,1,2】这个序列当【-1,-1,2】满足条件的 时候,左指针指向-1,右指针指向2,完成之后左右指针各自向中间移动一步,由于没有增加外部的循环,会导致错过-1,1,0这个组合。
第二版:
先去重复,再计算会导致【0,0,0】的组合被忽略、
第二版
vector<vector<int>> ans;
if (nums.empty())
return ans;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i++) {
if (i > 0 && nums[i] == nums[i-1])
continue;
int left = i + 1, right = nums.size()-1;
while(left < right) {
while (left < right && nums[left] == nums[left+1])
left++;
while(left < right && nums[right] == nums[right-1])
right--;
if (nums[i] + nums[right] + nums[left] == 0) {
ans.push_back({nums[i], nums[left], nums[right]});
left++;
right--;
} else if (nums[i] + nums[right] + nums[left] > 0) {
right--;
} else left++;
}
}
return ans;
第三版:
去重必须放在找到的组合之后,因为如果在没有找到的情况下去重,会导致[0,0,0】这种情况无法被涉及到。