当前位置: 首页 > 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自动去重
http://www.lqws.cn/news/190441.html

相关文章:

  • vm虚拟机添加虚拟机无反应,获取所有权
  • 在WPF项目中集成Python:Python.NET深度实战指南
  • 无人机定位系统技术设计与难点突破!
  • 接口限频算法:漏桶算法、令牌桶算法、滑动窗口算法
  • 智能生成完整 Java 后端架构,告别手动编写 ControllerServiceDao
  • 如何实现安卓端与苹果端互通的多种方案
  • 好子集的数目概念及表达形式
  • 每次clone都会有:Enter passphrase for key ‘/Users/xxx/.ssh/id_rsa‘:
  • [蓝桥杯]迷宫与陷阱
  • 排序算法总结(C++)
  • ansible和saltstack安装和简单操作
  • Python训练营打卡DAY46
  • EtherNet/IP转DeviceNet协议网关详解
  • 悲观锁和乐观锁
  • 命令行以TLS/SSL显式加密方式访问FTP服务器
  • 【Linux】ps 命令详解及使用示例:查看当前运行进程状态
  • Linux配置yum 时间同步服务 关闭防火墙 关闭ESlinux
  • 《C语言·源初法典》---C语言基础(上)
  • python fbx sdk
  • C/C++ 中附加包含目录、附加库目录与附加依赖项详解
  • placeholder不显示and模板字符串无效
  • leetcode sql50题
  • clickhouse 学习总结
  • Charles 全流程指南:安装、设置、抓包与注意事项
  • Redis知识
  • 缓解骨质疏松 —— 补钙和补维 D
  • LangChain【8】之工具包深度解析:从基础使用到高级实践
  • C++.OpenGL (6/64)坐标系统(Coordinate Systems)
  • C++单例模式教学指南
  • 2003-2024年高铁列车信息数据