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

Swift 实战:秒算两个数组的交集(LeetCode 349)

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • Swift 解法代码
      • 代码详解
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

两个数组取交集,看起来是个特别日常的操作,对吧?比如你想找出两个用户列表中共同的朋友,或者想知道两个商品集合里有什么是重复的。
但是在工程中,如果数据量稍微一大,写得不够高效就可能拖慢整个功能的响应速度。

今天我们就用 Swift 来实现 LeetCode 349 这道题,聊聊如何用集合(Set)这种数据结构,把交集运算写得又快又干净,还能直接放到你的项目里用。

描述

题目要求:

给定两个数组 nums1nums2,返回它们的交集,且结果中的每个元素必须是唯一的。输出顺序可以随意。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可行的

约束条件:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

题解答案

最直接的想法是:

  1. 把一个数组存进集合(Set),这样查找的时间复杂度是 O(1);
  2. 遍历另一个数组,把存在于集合中的元素加入结果集合;
  3. 最后返回结果集合转换成数组。

为什么用集合(Set)?

  • 因为 Set 会自动去重,不用手动检查重复值;
  • 查找元素是否存在的时间复杂度是 O(1);
  • 语法简洁,非常适合这种“唯一元素+快速查找”的场景。

题解代码分析

Swift 解法代码

class Solution {func intersection(_ nums1: [Int], _ nums2: [Int]) -> [Int] {let set1 = Set(nums1)let set2 = Set(nums2)let result = set1.intersection(set2)return Array(result)}
}

代码详解

let set1 = Set(nums1)
let set2 = Set(nums2)

这两行把两个数组都转成集合,自动去重,同时提高查找速度。

let result = set1.intersection(set2)

Swift 的 Set 自带 intersection 方法,直接返回两个集合的交集,不需要写循环。

return Array(result)

题目要求返回数组,所以最后转回 Array

这种写法简洁到极致,并且底层性能很高,因为 Swift 的 Set 是基于哈希表实现的。

示例测试及结果

我们来跑一下实际例子,顺便做成一个可以直接运行的 Demo。

// Demo 主程序
let solution = Solution()let nums1 = [1,2,2,1]
let nums2 = [2,2]
print("交集结果 1:", solution.intersection(nums1, nums2))let nums3 = [4,9,5]
let nums4 = [9,4,9,8,4]
print("交集结果 2:", solution.intersection(nums3, nums4))

输出结果:

交集结果 1: [2]
交集结果 2: [9, 4]

结果与题目要求一致,而且你会发现代码运行非常快,即使数据量大一些也不会卡顿。

时间复杂度

  • 转换为 Set:O(n) + O(m),n 和 m 分别是两个数组的长度;
  • 求交集:O(min(n, m));
  • 总体时间复杂度:O(n + m)

相比用双重循环的 O(n*m) 暴力解法,这种方式快太多。

空间复杂度

  • 需要两个集合来存储 nums1 和 nums2:O(n + m);
  • 结果集合也需要额外空间(但一般远小于输入数组总长度);
  • 总体空间复杂度:O(n + m)

在可接受的范围内换来了速度上的提升。

总结

这道题是集合操作的经典应用:

  • 利用 Set 自动去重 + 快速查找的特性,几行代码就能高效完成交集计算;
  • 时间复杂度直接降到 O(n + m),适合在用户量或数据量很大的情况下使用;
  • 在实际项目里,比如“找出两个用户群的共同好友”、“获取两个商品清单的重复商品”都可以用同样思路。

如果你在 Swift 项目中经常遇到集合相关运算,不妨熟悉一下 intersectionunionsubtracting 这些方法,很多需求几行就搞定。

http://www.dtcms.com/a/322689.html

相关文章:

  • 一周学会Matplotlib3 Python 数据可视化-标注 (Annotations)
  • 力扣-74.搜索二维矩阵
  • [Oracle] MAX()和MIN()函数
  • 深入理解 Gin 框架的路由机制:从基础使用到核心原理
  • Linux系统之lua 详解
  • 版本控制的详细说明介绍(已有github账号版)
  • 记一次奇异的bug
  • 蓝牙技术概览
  • [Oracle] SUBSTR()函数
  • 轻量化阅读应用实践:21MB无广告电子书阅读器测评
  • Spring Boot 应用测试全指南:从单元测试到集成测试的实战之路
  • 密集遮挡场景识别率↑31%!陌讯轻量化部署方案在智慧零售的实战解析
  • ppt 生成视频的 ai 大模型全面解析
  • ORA-600 kcratr_nab_less_than_odr和ORA-600 4194故障处理---惜分飞
  • 书生浦语第五期-L1G4-InternLM 论文分类微调实践(XTuner 版)
  • 机器翻译中的语言学基础详解(包括包括语法、句法和语义学等)
  • HashTable, HashMap, ConcurrentHashMap
  • SpringBoot 集成 MapStruct
  • 10. 怎么实现深拷贝?
  • 大模型SSE流式输出技术
  • C++ 类模板
  • 使用langchain框架开发一个能调用工具的聊天助手Demo
  • MCU-基于TC397的启动流程
  • SQL基本
  • “自动报社保 + 查询导出 ” 的完整架构图和 Playwright C# 项目初始化模板
  • 2022 RoboCom 世界机器人开发者大赛-本科组(国赛)
  • 【阿里巴巴大数据实践之路学习记录】第十章-维度设计
  • 算法_python_学习记录_02
  • Docker大全
  • 通过 Docker 运行 Prometheus 入门