本题思路较为简单,使用枚举的方式即可完成.首先枚举第一个数字,那么后面的两个数据的和应该是第一个数据的相反数,为了加快比较效率,我们对原始的数据进行排序,那么如果上一个和这一个数据相同的话就不需要再进行枚举.而且对于第三个数据来说,我们可以使用两端数据相加和与目标值的大小来判断第三个数据应该在的位置,也可以加快比较速度.
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
// 因为可能会存在相同的元素,那么其对应的结果也会是一样的,则可以通过排序每次遍历不同的元素进行筛选
sort(nums.begin(), nums.end());
// 枚举第一位数
for(int i = 0;i < nums.size(); ++i)
{
// 这里之所以需要i > 0是因为第一次比较的时候会出错并且第一次也不需要比较
if(i > 0 && nums[i] == nums[i - 1])
continue;
// 后面两个数的总和应该是目标值,也可以达到题目要求
int target = -nums[i];
// 现在数组是有序的,利用两端相加与目标值判断大小,即可快速缩小k的值
int k = nums.size() - 1;
// 枚举第二位数
for(int j = i + 1;j < nums.size();++j)
{
// 这里同样需要和上面一样不能重复,这里需要注意j的第一次比较和i的第一次比较类似,注意范围
// if(j > 0 && nums[j] == nums[j - 1])
if(j > i + 1 && nums[j] == nums[j - 1])
continue;
while(j < k && nums[j] + nums[k] > target)
--k;
if(j == k)
break;
if(nums[j] + nums[k] == target)
res.push_back({nums[i], nums[j], nums[k]});
}
}
return res;
}
};
该代码实现了一个C++函数,通过排序数组并使用双指针枚举方法寻找数组中三个数的和为目标值的所有组合。通过避免重复元素和优化搜索范围提高了效率。
779

被折叠的 条评论
为什么被折叠?



