原题:
Given an array
nums
of n integers, are there elements a, b, c innums
such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.Note:
The solution set must not contain duplicate triplets.
Example:
Given array nums = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]
在数列中找到所有三个和为零的元素并输出,注意有重复组成元素的不算。办法是先排序,然后从左到右依次遍历作为目标值,对于每一个目标值只要在后面找到等于这个目标值的相反数的就行。在找目标值时,设置一前一后两个指针,前面的初始位置是目标值位置+1,后面的在数列末尾,如果和大于目标值,后面的指针减一,小于则加一。为了排除重复元素,要在找到目标值时前后指针都跳过重复值才能继续寻找,并且在目标值改变时跳过所有相同的目标值。为了进一步减少不必要的运算,在目标值大于零是时就可以完全停止寻找了,结果:
Success
Runtime: 92 ms, faster than 93.21% of C++ online submissions for 3Sum.
Memory Usage: 15.7 MB, less than 50.00% of C++ online submissions for 3Sum.
代码:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
if(nums.size()<3){return res;}
sort(nums.begin(),nums.end());
int size=nums.size();
for(int i=0;i<size-2&&nums[i]<=0;i++){
if(i >= 1 && nums[i] == nums[i-1]){continue;}
int t=nums[i];
int l=i+1;
int r=size-1;
while(l<r){
if(nums[l]+nums[r]<-t){
l++;
}
else if(nums[l]+nums[r]>-t){
r--;}
else{
vector<int> ans(3,0);
ans[0]=t;
ans[1]=nums[l];
ans[2]=nums[r];
res.push_back(ans);
while(l<r&&nums[l]==ans[1]){l++;}
while(l<r&&nums[r]==ans[2]){r--;}
}
}
}
return res;
}
};