classSolution{public:vector<vector<int>>threeSum(vector<int>& nums){vector<vector<int>> res;sort(nums.begin(), nums.end());int n = nums.size();if(n <3)return res;for(int i =0; i < n;++i){if(nums[i]>0)break;if(i >0&& nums[i]== nums[i -1])continue;int l = i +1, r = n -1;while(l < r){int sum = nums[i]+ nums[l]+ nums[r];if(sum ==0){res.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;}elseif(sum <0){++l;}else{--r;}}}return res;}};
✅ 时间复杂度:
排序:O(n log n)
外层遍历 + 双指针:O(n²)
总体:O(n²),是最优解。
✅ 解法二:哈希表 + 去重(思维训练用)
✅ 思路简要:
枚举第一个数 nums[i]。
对于剩下的元素,用 unordered_set 找两数之和为 -nums[i]。
用 set 去重三元组(也可以手动判断是否存在)。
✅ C++ 代码:
classSolution{public:vector<vector<int>>threeSum(vector<int>& nums){set<vector<int>> resSet;int n = nums.size();sort(nums.begin(), nums.end());for(int i =0; i < n -2;++i){int target =-nums[i];unordered_set<int> seen;for(int j = i +1; j < n;++j){int complement = target - nums[j];if(seen.count(complement)){vector<int> triplet ={nums[i], complement, nums[j]};sort(triplet.begin(), triplet.end());// 排序去重resSet.insert(triplet);}seen.insert(nums[j]);}}returnvector<vector<int>>(resSet.begin(), resSet.end());}};