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] ]
解析:将3Sum转为2Sum问题,时间复杂度为O(n^2)。注意重复元素。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int> > res;
if (nums.size() < 3) return res;
int i = 0;
while (i < nums.size() - 2)
{
int left = 0 - nums[i];
int l = i + 1, r = nums.size() - 1;
while(l < r)
{
int t = nums[l] + nums[r];
if (t == left)
{
vector<int> tmp;
tmp.push_back(nums[i]);
tmp.push_back(nums[l]);
tmp.push_back(nums[r]);
res.push_back(tmp);
l++;
r--;
while(l < r && nums[l] == nums[l-1]) {l++;};
while(l < r && nums[r] == nums[r+1]){r--;};
}
else if (t < left) {
l++;
}
else {
r--;
}
}
int j = i + 1;
for (j = i + 1; j < nums.size() - 2; ++j) {
if (nums[j] != nums[i]) break;
}
i = j;
}
return res;
}
};