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

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.xdnf.cn/news/12376.html

相关文章:

  • 《零基础读懂新能源汽车》—— 新能源汽车充电革命:从逆变器原理到800V超充实战,一篇全掌握!
  • 【生成模型】【模型介绍】(二)图像编辑 主体驱动 光照调整
  • 终极数据结构详解:从理论到实践
  • matlab不同版本对编译器的要求(sfunction 死机)
  • 使用变异系数增强 CFD 收敛标准
  • kafka消息积压排查
  • 计算机文化
  • Spring Boot 类加载机制深度解析
  • 【JMeter】后置处理器 - 提取器
  • 【PhysUnits】16.2 引入变量后的乘法实现(mul.rs)
  • 国标GB28181设备管理软件EasyGBS远程视频监控方案助力高效安全运营
  • Node-RED 基于流程的可视化编程工具
  • Ubuntu 系统.sh脚本一键部署内网Java服务(组件使用docker镜像,宕机自启动)
  • web前端开发如何适配各分辨率
  • 【PmHub面试篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现面试专题解析
  • 基于蚁群算法路由选择可视化动态模拟设计与实现【源码+文档】
  • ES数据聚合
  • Python 训练营打卡 Day 45
  • 全球长序列高分辨率光合有效辐射(PAR)(1984-2018)
  • 郑州工程技术学院赴埃文科技开展访企拓岗促就业活动
  • Unity | AmplifyShaderEditor插件基础(第五集:简易移动shader)
  • 高效复用 Cursor 请求,提升开发效率 —— 使用 interactive-feedback-mcp 工具详解
  • 【单片机期末】单片机系统设计
  • 车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
  • 从 Revit 到 3DTiles:GISBox RVT 切片器如何让建筑图元在 Web 端展示
  • AudioRelay 0.27.5 手机充当电脑音响
  • 数据通信 PoE 交换机解决方案
  • 基于springboot的校园社团信息系统的设计与实现
  • 智慧水务发展迅猛:从物联网架构到AIoT系统的跨越式升级
  • JavaWeb笔记