题目要求

题解
指针移动逻辑

去重逻辑


cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
int n = nums.size();
if (n < 3) return res; // 不足3个元素直接返回空
sort(nums.begin(), nums.end()); // 1. 排序
for (int i = 0; i < n; ++i) {
// 去重:如果当前数和前一个相同,跳过
if (i > 0 && nums[i] == nums[i-1]) continue;
int target = -nums[i]; // 要找的两数之和 = -nums[i]
int left = i + 1;
int right = n - 1;
while (left < right) {
int sum = nums[left] + nums[right];
if (sum == target) {
// 找到一组解,加入结果
res.push_back({nums[i], nums[left], nums[right]});
// 去重:跳过left方向的重复元素
while (left < right && nums[left] == nums[left+1]) left++;
// 去重:跳过right方向的重复元素
while (left < right && nums[right] == nums[right-1]) right--;
// 移动指针继续找
left++;
right--;
} else if (sum < target) {
left++; // 和太小,增大left
} else {
right--; // 和太大,减小right
}
}
}
return res;
}
};
// 测试
int main() {
Solution sol;
vector<int> nums = {-1, 0, 1, 2, -1, -4};
vector<vector<int>> ans = sol.threeSum(nums);
// 输出结果
cout << "[";
for (int i = 0; i < ans.size(); ++i) {
cout << "[";
for (int j = 0; j < 3; ++j) {
cout << ans[i][j] << (j == 2 ? "" : ",");
}
cout << "]" << (i == ans.size()-1 ? "" : ",");
}
cout << "]" << endl; // 输出 [[-1,-1,2],[-1,0,1]]
return 0;
}