当前位置: 首页 > news >正文

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自动去重

相关文章:

  • 低内聚高耦合的衡量指标
  • Linux top 命令 的使用总结
  • Python Day43 学习(日志Day10-11复习)
  • SQLServer中的存储过程与事务
  • 【普及+/提高】洛谷P2114 ——[NOI2014] 起床困难综合症
  • Linux操作系统之进程(五):初识地址空间
  • JAVA元编程
  • SCSAI工业智能操作系统=PLM对象模型 × 大模型认知引擎 × 工作流调度层
  • 分布式锁-Redisson实现
  • Linux编程:1、文件编程
  • yolov8自训练模型作为预训练权重【增加新类别】注意事项
  • 思维链的 内部机制和简单理解
  • Q: dify前端使用哪些开发框架?
  • RK3588 火焰烟雾检测
  • 2025.6.5学习日记 Nginx主目录文件 .conf介绍、热部署 定时日志切割
  • MySQL基础(二)SQL语言、客户端工具
  • python中的经典视觉模块:OpenCV(cv2)全面解析
  • 数学复习笔记 28
  • 代理服务器-LVS的3种模式与调度算法
  • c++ set与multiset的介绍
  • 怎么增加网站访问量/东莞企业网站排名优化
  • 数据网站建设工具模板/抖音搜索seo排名优化
  • 铜陵app网站做招聘/优化网站
  • 手机版网站建设开发/中国时事新闻网
  • 自己怎么建设网站/苏州搜索引擎优化
  • 供求信息网站建设报价/东莞网络推广