Given an array S of n integers, are there elements a, b, c in S 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.
For example, given array S = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
三个数字需要按照非递减序列排放,因此先排序,再固定一个数,再用两个指针left和right从这个数后面的两边往中间查找,当这三个数之和等于0的时候,记录一下,当之和大于0的时候,right左移,而当之和小于0的时候,left右移,直到left和right相遇。这个其实就是在Two Sum外层加1层循环,因此时间复杂度是排序的O(nlogn)加O(n2),即O(n2)。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
vector<int> ressub;
int n=nums.size();
if(n<3) return res;
sort(nums.begin(),nums.end());
int i=0,j=1,left=2,right=n-1,m=2,target=0;
while((nums[i]<=0)&&((i+2)<n)){
left=i+1;
right=n-1;
int sum =0;
while(left<right){
sum =nums[left]+nums[right];
if(sum<(-nums[i])){
++left;
}
else if(sum>(-nums[i])){
--right;
}
else{
ressub.push_back(nums[i]);
ressub.push_back(nums[left]);
ressub.push_back(nums[right]);
res.push_back(ressub);
ressub.clear();
while(((left+1)<n)&&(nums[left]==nums[left+1])){
++left;
}
++left;
while(((right-1)>-1)&&(nums[right]==nums[right-1])){
--right;
}
--right;
}
}
while(nums[i]==nums[i+1]){
++i;
}
++i;
}
return res;
}
};