欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > 09.三数之和

09.三数之和

2025/6/7 6:53:49 来源:https://blog.csdn.net/youchou1274/article/details/148481363  浏览:    关键词:09.三数之和

在这里插入图片描述

✅ 解法一:排序 + 双指针(最优推荐解)

✅ 思路简要:

  1. 排序数组。
  2. 枚举第一个数 nums[i]
  3. 使用 双指针(从 i+1 到末尾)找其余两个数,使得三数之和为 0
  4. 跳过重复元素,避免重复解。

✅ C++ 代码:

class Solution {
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;} else if (sum < 0) {++l;} else {--r;}}}return res;}
};

✅ 时间复杂度:

  • 排序:O(n log n)
  • 外层遍历 + 双指针:O(n²)
  • 总体:O(n²),是最优解。

✅ 解法二:哈希表 + 去重(思维训练用)

✅ 思路简要:

  1. 枚举第一个数 nums[i]
  2. 对于剩下的元素,用 unordered_set 找两数之和为 -nums[i]
  3. set 去重三元组(也可以手动判断是否存在)。

✅ C++ 代码:

class Solution {
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]);}}return vector<vector<int>>(resSet.begin(), resSet.end());}
};

✅ 特点:

  • 利用哈希表 seen 实现 O(1) 查找
  • 去重使用 set,也可手动实现去重逻辑。
  • 时间复杂度依旧为 O(n²),但常数略大。

✅ 总结对比

解法方法是否排序是否推荐时间复杂度空间复杂度重复处理
解法一排序 + 双指针✅推荐O(n²)O(1)精准跳过重复
解法二枚举 + 哈希表补充理解用O(n²)O(n)set自动去重

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词