题目描述
代码
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
return threeSumTarget(nums, 0);
}
vector<vector<int>> threeSumTarget(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int n = nums.size();
vector<vector<int>> res;
for (int i = 0; i < n; i++) {
vector<vector<int>>
tuples = twoSumTarget(nums, i + 1, target - nums[i]);
for (vector<int>& tuple : tuples) {
tuple.push_back(nums[i]);
res.push_back(tuple);
}
while (i < n - 1 && nums[i] == nums[i + 1]) i++;
}
return res;
}
vector<vector<int>> twoSumTarget(vector<int>& nums, int start, int target) {
sort(nums.begin(), nums.end());
int lo = start, hi = nums.size() - 1;
vector<vector<int>> res;
while (lo < hi) {
int sum = nums[lo] + nums[hi];
int left = nums[lo], right = nums[hi];
if (sum < target) {
while (lo < hi && nums[lo] == left) lo++;
} else if (sum > target) {
while (lo < hi && nums[hi] == right) hi--;
} else {
res.push_back({left, right});
while (lo < hi && nums[lo] == left) lo++;
while (lo < hi && nums[hi] == right) hi--;
}
}
return res;
}
};