题目:
给你一个整数数组 nums
,判断是否存在三元组 [nums[i], nums[j], nums[k]]
满足 i != j
、i != k
且 j != k
,同时还满足 nums[i] + nums[j] + nums[k] == 0
。请
你返回所有和为 0
且不重复的三元组。
**注意:**答案中不可以包含重复的三元组。
题解:
第一步先对数组排序,然后依次枚举每一个数然后用查找两数之和的办法查找是否有两个数与当前枚举的数相加等于0。我认为本题的难点在于,在实现上述目标的基础上加上不可包含重复的三元组,这里相当于是一个小的数学知识,a,b,c三个数和是定值,如果这三个数中有两个数不变,那第三个值怎么变都是一样的,所以要想是非重复的三元组,在找到一组答案后再找下一组时至少要有两个数是与上次是不一样的。
cpp
vector<vector<int>>ans;
void f(int l,int r,vector<int>&arr,int k){
while(l<r){
if(arr[l]+arr[r]+arr[k]>0)r-=1;
else if(arr[l]+arr[r]+arr[k]<0)l+=1;
else {
ans.push_back({arr[k],arr[l],arr[r]});
//找下一组不重复的三元组
l++;
r--;
while(l<r&&arr[l]==arr[l-1]){
l++;
}
while(l<r&&arr[r]==arr[r+1]){
r--;
}
}
}
}
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size()-2;i++){
//相同的数只用枚举查找一次即可
if(i&&nums[i]==nums[i-1])continue;
f(i+1,nums.size()-1,nums,i);
}
return ans;
}
时间复杂度:O(n)