题目描述
思路解析动画文字版
思路一句话:先把 nums1 装进集合 seen(自动去重),再扫 nums2,在 seen 里的就是交集、收进 ans(也去重)。下面一步步演给你看。
第一步:把 nums1 的数字全倒进集合 seen,重复的自动去掉,得到 {4, 9, 5}。接下来开始扫 nums2。
指针 i 走到下标 0,这一格的值是 9。去集合 seen 里查它在不在。
9 在集合里、之前还没收过,是新的交集元素,收进 ans。集合侧栏里它被点亮了。
指针 i 走到下标 1,这一格的值是 4。去集合 seen 里查它在不在。
4 在集合里、之前还没收过,是新的交集元素,收进 ans。集合侧栏里它被点亮了。
指针 i 走到下标 2,这一格的值是 9。去集合 seen 里查它在不在。
9 确实在集合里,可 ans 里已经记过一次了。交集每个数只算一次,所以这次不再收,ans 保持不变。
指针 i 走到下标 3,这一格的值是 8。去集合 seen 里查它在不在。
8 不在集合 seen 里,说明 nums1 根本没出现过这个数,不是交集,标红跳过。
指针 i 走到下标 4,这一格的值是 4。去集合 seen 里查它在不在。
4 确实在集合里,可 ans 里已经记过一次了。交集每个数只算一次,所以这次不再收,ans 保持不变。
指针 i 走到下标 5,这一格的值是 7。去集合 seen 里查它在不在。
7 不在集合 seen 里,说明 nums1 根本没出现过这个数,不是交集,标红跳过。
指针 i 走到下标 6,这一格的值是 5。去集合 seen 里查它在不在。
5 在集合里、之前还没收过,是新的交集元素,收进 ans。集合侧栏里它被点亮了。
指针 i 走到下标 7,这一格的值是 6。去集合 seen 里查它在不在。
6 不在集合 seen 里,说明 nums1 根本没出现过这个数,不是交集,标红跳过。
指针 i 走到下标 8,这一格的值是 5。去集合 seen 里查它在不在。
5 确实在集合里,可 ans 里已经记过一次了。交集每个数只算一次,所以这次不再收,ans 保持不变。
指针 i 走到下标 9,这一格的值是 9。去集合 seen 里查它在不在。
9 确实在集合里,可 ans 里已经记过一次了。交集每个数只算一次,所以这次不再收,ans 保持不变。
扫到末尾,nums2 里凡是在集合中的格子都被点亮,去重后的交集就是 [9, 4, 5]。
三个高频追问:为什么用集合、要保留次数怎么办、要不要排序。
参考代码
def intersection(nums1, nums2): seen = set(nums1) # nums1 装进集合,自动去重 ans = set() # 交集结果,也用集合防重复 for x in nums2: # 扫 nums2 的每个数 if x in seen: # 在集合里 → 两边都有 ans.add(x) # 收进交集(重复自动忽略) return list(ans)复杂度
- 时间:O(n + m),建 seen 扫一遍 nums1(n 个),再扫一遍 nums2(m 个),集合查询是 O(1)
- 空间:O(n),集合 seen 最多装下 nums1 去重后的全部数字
易错点
面试追问把动画讲成自己的话
追问为什么用集合而不是两层循环?
追问如果要保留出现次数(求交集的多重集),怎么改?
追问结果需要排序吗?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
最长回文串
LeetCode 409 · 简单 · 沿着 哈希套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题