class Solution {
public:
vector<vector<int> > threeSum(vector<int> &nums) {
int size = nums.size();
vector<vector<int>> results;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i++) {
if (i > 0 && nums[i] == nums[i-1]) {
continue;
}
int target = -nums[i];
int left = i + 1;
int right = nums.size() - 1;
twoSum (nums, left, right, target, results);
}
return results;
}
void twoSum (vector<int> &nums, int start, int end, int target, vector<vector<int>> &results) {
int left = start;
int right = end;
while (left < right) {
int sum = nums[left] + nums[right];
if (left < right && sum == target) {
vector<int> solution;
solution.push_back(nums[start - 1]);
solution.push_back(nums[left]);
solution.push_back(nums[right]);
results.push_back(solution);
left++;
right--;
while (left < right && nums[left] == nums[left - 1]) {
left++;
}
while (left < right && nums[right] == nums[right + 1]) {
right--;
}
}
if (left < right && sum < target) {
left++;
}
if (left < right && sum > target) {
right--;
}
}
}
};