逐行解释class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { sort(nums.begin(), nums.end()); int l = 0, r = nums.size() - 1; vector<vector<int> > ans; for (int i = 0; i < nums.size() - 2; ++i) { if (i > 0 && nums[i] == nums[i - 1]) continue; // 跳过重复的元素 int l = i + 1, r = nums.size() - 1; while (l < r) { int sum = nums[i] + nums[l] + nums[r]; if (sum == 0) { ans.push_back({nums[i], nums[l], nums[r]}); while (l < r && nums[l] == nums[l + 1]) ++l; // 跳过重复的元素 while (l < r && nums[r] == nums[r - 1]) --r; // 跳过重复的元素 ++l; --r; } else if (sum < 0) { ++l; } else { --r; } } } return ans; } };
时间: 2025-04-01 22:07:23 浏览: 50
下面是对上述代码的逐行详细解释:
```cpp
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
```
- 定义了一个名为 `Solution` 的类,并提供了一个公共成员函数 `threeSum()`,该函数接收一个整型向量 `nums` 并返回所有三个数字相加等于零的独特三元组列表。
```cpp
sort(nums.begin(), nums.end());
```
- 使用 C++ STL 中的 `sort` 函数对输入数组进行了升序排列。这一步很重要,因为它允许我们在后续步骤中更容易地排除重复项并应用双指针技巧。
```cpp
int l = 0, r = nums.size() - 1;
vector<vector<int> > ans;
```
- 初始化两个变量 `l` 和 `r` 分别用于存储左边界和右边界的初始值,但实际上这两个变量在整个过程中会被不断修改。
- 创建空的结果二维向量 `ans` 来保存最终找到的所有满足条件的三元组。
```cpp
for (int i = 0; i < nums.size() - 2; ++i) {
```
- 开始遍历整个排序后的数组 `nums` ,注意这里限制了最多到倒数第三个元素即可开始尝试构造三元组。
```cpp
if (i > 0 && nums[i] == nums[i - 1]) continue; // 跳过重复的元素
```
- 检查当前迭代是否为第一次或当前数字与之前的一个相同;如果是后者则直接跳过此次循环以防产生冗余解。
```cpp
int l = i + 1, r = nums.size() - 1;
```
- 针对于固定的首个元素 `nums[i]` 设置左右边界的初值分别为下一个索引位置 `(i+1)` 及最后一个可用索引 `(n-1)`。
```cpp
while (l < r) {
```
- 进入核心的 "夹逼" 循环——只要左侧小于右侧就持续运行此内部逻辑块直到两指针相遇为止。
```cpp
int sum = nums[i] + nums[l] + nums[r];
```
- 计算当前选定的三项之总合以便判定下一步动作方向。
```cpp
if (sum == 0) {
ans.push_back({nums[i], nums[l], nums[r]});
```
- 如果正好匹配目标值零,则将这三个组成的新向量加入到解答集合之中。
```cpp
while (l < r && nums[l] == nums[l + 1]) ++l; // 跳过重复的元素
while (l < r && nums[r] == nums[r - 1]) --r; // 跳过重复的元素
++l; --r;
```
- 发现有效组合后进一步移动左右两侧以探索其他可能性,同时也需规避连续相同的数值造成干扰。
```cpp
} else if (sum < 0) {
++l;
```
- 总和偏小意味着左边选得太低所以右移左指针增加整体合计。
```cpp
} else {
--r;
```
- 类似的如果超过期望的目标那么应降低上限减小小计数值。
```cpp
}
}
}
return ans;
}
};
```
###
阅读全文
相关推荐



















