3Sum
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:
- Elements in a triplet (a,b,c) must be in non-descending order. (ie,a ≤ b ≤ c)
- 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)
Attention!
0 == num.size()
sort()
(int)num.size() - 2
how to avoid duplicates
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int> > ret;
if(0 == num.size()) return ret;
sort(num.begin(), num.end());
int numi = num[0] - 1;
for(int idx = 0; idx < (int)num.size() - 2; ++idx)
{
if(numi == num[idx])
continue;
else
{
numi = num[idx];
int left = idx + 1;
int right = num.size() - 1;
int sum = 0;
while(left < right)
{
sum = numi + num[left] + num[right];
if(0 == sum)
{
ret.push_back(vector<int>());
vector<int>& item = ret.back();
item.push_back(numi);
item.push_back(num[left]);
item.push_back(num[right]);
int temp = num[left];
while(++left <= right && temp == num[left]);
temp = num[right];
while(--right >= left && temp == num[right]);
}
else if(sum > 0)
{
--right;
}
else
{
++left;
}
}
}
}
return ret;
}
};