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

每日算法 -【Swift 算法】三数之和

Swift|三数之和(3Sum)详细题解 + 注释 + 拓展(LeetCode 15)

✨题目描述

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a, b, c,使得 a + b + c = 0。请你找出所有和为 0 且不重复的三元组。

注意:答案中不能包含重复的三元组。


🧠解题思路

本题是 LeetCode 中非常经典的“双指针”+“去重”问题,属于中等难度。

✅ 步骤如下:

  1. 对数组进行排序:便于后续去重处理和双指针的使用。
  2. 固定一个数 nums[i]:枚举 i,并为其设置两个指针 left(i+1)和 right(nums.count - 1)。
  3. 使用双指针向中间靠拢,判断三数之和是否为 0。
  4. 去重操作
    • i 进行去重,跳过与前一个数相同的情况。
    • leftright 也要去重,防止重复三元组。

🧾 Swift 代码实现(含详细注释)

func threeSum(_ nums: [Int]) -> [[Int]] {let nums = nums.sorted()  // 排序是关键,便于去重和双指针var result: [[Int]] = []for i in 0..<nums.count - 2 {// 如果当前数字和前一个数字相同,跳过,避免重复三元组if i > 0 && nums[i] == nums[i - 1] {continue}var left = i + 1var right = nums.count - 1while left < right {let sum = nums[i] + nums[left] + nums[right]if sum == 0 {// 找到一个有效三元组result.append([nums[i], nums[left], nums[right]])// 去重:移动 left 指针跳过相同的数while left < right && nums[left] == nums[left + 1] {left += 1}// 去重:移动 right 指针跳过相同的数while left < right && nums[right] == nums[right - 1] {right -= 1}left += 1right -= 1} else if sum < 0 {// 总和偏小,左指针右移以增大总和left += 1} else {// 总和偏大,右指针左移以减小总和right -= 1}}}return result
}

⏱️时间复杂度分析

步骤复杂度
排序O(nlogn)
遍历 + 双指针查找O(n^2)
总体时间复杂度O(n²)
  • n 是数组的长度。
  • 最坏情况下,每个元素都要与后面的所有元素进行组合查找。

🧠空间复杂度

  • 使用了常数级别的辅助空间(除了结果数组):O(1)
  • 如果考虑返回结果的空间,那么是 O(k),其中 k 为结果中三元组的个数。

🔍输入输出示例

let nums = [-1, 0, 1, 2, -1, -4]
print(threeSum(nums)) 
// 输出: [[-1, -1, 2], [-1, 0, 1]]

🧱边界情况说明

输入输出说明
[][]空数组
[0, 0, 0][[0,0,0]]需要处理重复值
[1, 2, -2, -1][]没有满足条件的组合

🧩拓展与优化

  1. 如果要求和为 target 而非 0

    • 将判断条件 sum == 0 改为 sum == target 即可。
    • 本题可以推广为 kSum 问题(如 Two Sum、Four Sum)。
  2. 去重逻辑处理建议封装为函数

    • 提高代码可读性与复用性。
  3. Swift 中使用 Set 存储结果避免重复

    • 如果输入较多或存在重复项较多,可以考虑用 Set<[Int]> 先去重再转成 [[Int]]

🏁总结

  • 本题考察的是数组排序 + 双指针技巧。
  • 核心是合理处理重复元素,避免重复解。
  • 时间复杂度为 O(n²),在面试中属于经典问题,建议掌握。

如果你觉得有用,欢迎点赞、评论支持我继续更新 💪
你也可以在评论区分享你遇到的变体,我来帮你一起解答!

http://www.lqws.cn/news/133165.html

相关文章:

  • 机器翻译模型笔记
  • 【25-cv-06151】FOLDABLE MIRROR三面折叠镜专利维权案
  • MaskSearch:提升智能体搜索能力的新框架
  • 中级统计师-经济学基础知识-第一章 经济学基础
  • JAVA 集合进阶 01 - 05 双列集合
  • 八:操作系统设备管理之设备驱动程序
  • LangChain4J 使用实践
  • PPTAGENT:让PPT生成更智能
  • Java中的多态
  • Canal
  • A2A MCP 集成
  • 硬路由与软路由
  • GMS地下水数值模拟技术及地下水环评
  • NNLM和word2vec的区别
  • 软件工程专业的本科生应该具备哪些技能
  • 4种常见Python设计爱心创意实现方法
  • ROS中的里程计与IMU的消息类型解读
  • apt-get update提示gpg错误
  • 跨域请求解决方案全解析
  • JAVA-springboot JOSN解析库
  • 基于Web的安全漏洞分析与修复平台设计与实现
  • AT2401C中科微2.4g芯片PA
  • 软件工程专业本科毕业论文模板
  • Vue中的自定义事件
  • 手写 vue 源码 === runtime-dom 实现
  • 第十四章 Java基础-接口
  • CMake入门:3、变量操作 set 和 list
  • 使用TypeScript构建一个最简单的MCP服务器
  • 【docker】Windows安装docker
  • 智慧货运飞船多维度可视化管控系统