给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:
输入:nums = []
输出:[]
示例 3:
输入:nums = [0]
输出:[]
提示:
0 <= nums.length <= 3000
-105 <= nums[i] <= 105
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
int n=nums.size();
vector<vector<int >> result;
for(int i=0;i<n;i++){
if(nums[i]>0){
return result;
}
//对第一个元素去重
if(i>0&&nums[i]==nums[i-1]){
continue;
}
int L=i+1;
int R=n-1;
while(R>L){
int temp=nums[i]+nums[L]+nums[R];
if(temp>0){
R--;
}else if(temp<0){
L++;
}else{
result.push_back(vector<int>{nums[i],nums[L],nums[R]});
//对第二、第三个元素去重
while (R > L && nums[R] == nums[R-1]) R--;
while (R > L && nums[L] == nums[L + 1]) L++;
R--;
L++;
}
}
}
return result;
}
};
总结:
要注意元素(nums[i],nums[L],nums[R])的去重
对第一个元素(nums[i])去重:
仔细思考是判断 nums[i] 与 nums[i + 1]是否相同,还是判断 nums[i] 与 nums[i-1] 是否相同。
如果我们的写法是 这样就遗漏了{-1,-1,2}这组数据;
if (nums[i] == nums[i + 1]) { // 去重操作
continue;
}
对第二个、第三个元素去重;
首先去重的基础是先找到了这样的三元组,再判断下一个满足这样的三元组是否与前一组相同·。
while (R > L && nums[R] == nums[R-1]) R--;
while (R > L && nums[L] == nums[L + 1]) L++;
R--;
L++;
所以R--;L++。