参考这位大佬的题解,我们先写了一个求两数之和的函数vector<vector<int>>towSumTarget(vector<int>& nums,int start ,int target)
采用双指针的方法,去求解数组内两数和的值等于target的所有数,
res.push_back({ left, right }); //压入满足条件的数组
// 跳过所有重复的元素
while (l < h && nums[l] == left) l++;
while (l < h && nums[h] == right) h--;
因为在数组里有重复的元素,可能会造成重复的结果,比如(1,2),(2,1)我们采用这一步跳过重复的元素
接着求三数之和等于0,具体参考上面那位大佬的题解,这里简单写一下思路
引用求两数之和的与某个值的的函数,遍历数组,将每个值取反,作为求和的目标,放入求两数之和的函数函数里,最后如果满足条件,我们则将这个数压入
class Solution {
public:
vector<vector<int>>towSumTarget(vector<int>& nums,int start ,int target)
{
sort(nums.begin(), nums.end());
int l = start, h = nums.size() - 1;
vector<vector<int>>res;
while (l < h)
{
int sum = nums[l] + nums[h];
int left = nums[l], right = nums[h];
if (sum < target)
{
l++;
}
else {
if (sum > target)h--;
else {
res.push_back({ left, right });
// 跳过所有重复的元素
while (l < h && nums[l] == left) l++;
while (l < h && nums[h] == right) h--;
}
}
}
return res;
}
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>>s;
int ans = 0;
int n = nums.size();
for (int i = 0; i < n; i++)
{
vector<vector<int>>res= towSumTarget(nums, i + 1, -nums[i]);
for (vector<int>& tuple : res)
{
tuple.push_back(nums[i]);
s.push_back(tuple);
}
// 跳过第一个数字重复的情况,否则会出现重复结果
while (i < n - 1 && nums[i] == nums[i + 1]) i++;
}
/*for (vector<int>& tuple : tuples) 表示对tuples中的每个元素进行引用赋值,
即将tuples中的每个向量(vector)都作为一个引用传递给变量tuple,
这意味着在循环内部对tuple所做的修改都会直接反映到原tuples中的对应向量上。*/
return s;
}
};