题目描述
思路解析动画文字版
记住「两边各去重成集合 → 各取对方没有的 → 共有的都不要」,下面每帧都在套它。
先处理 nums1。把每个数往集合 s1 里塞,集合天生不存重复,所以塞完就是 nums1 的「不同元素」。盯住右边 s1 怎么长起来。
第 0 位是 1,s1 里还没有,加进去。s1 现在是 {1}。
第 1 位是 2,s1 里还没有,加进去。s1 现在是 {1, 2}。
第 2 位是 3,s1 里还没有,加进去。s1 现在是 {1, 2, 3}。
第 3 位又是 1,s1 里早有了,去重不再加。这就是用集合的好处:重复的自动被挡在外面。
再用同样的办法处理 nums2,逐个塞进集合 s2。两个集合都备好后,剩下的就是互相对照「谁有谁没有」。
第 0 位是 2,加入 s2。s2 现在是 {2}。
第 1 位是 4,加入 s2。s2 现在是 {2, 4}。
第 2 位是 6,加入 s2。s2 现在是 {2, 4, 6}。
第 3 位又是 6,s2 里已经有了,去重跳过。
现在屏幕这排是 s1 的元素 {1, 2, 3}。逐个去问 s2:你有没有这个数?s2 没有的,就是「只在 nums1」的,收进左边答案。
1 在 s2 里找不到,说明它只在 nums1,收进左边答案。只在 nums1 = [1]。
2 在 s2 里也有,是两边共有的,按规则两边都不要,跳过。
3 在 s2 里找不到,说明它只在 nums1,收进左边答案。只在 nums1 = [1, 3]。
换个方向,这排是 s2 的元素 {2, 4, 6}。逐个去问 s1:有没有?s1 没有的,就是「只在 nums2」,收进右边答案。
2 在 s1 里也有,又是共有元素,跳过。
4 在 s1 里没有,只在 nums2,收进右边答案。只在 nums2 = [4]。
6 在 s1 里没有,只在 nums2,收进右边答案。只在 nums2 = [4, 6]。
两个方向都对照完,答案就是 [[1, 3], [4, 6]]。回头看:先各自去重成集合,再各取对方没有的,共有的 2 全程被两次跳过,一遍就分清了。
边界:两边一样返回两空列表;完全不相交则各自独有全收;数组内重复先去重。
两个高频追问:哈希集合 O(n+m) 比排序快、两个集合最清晰。
参考代码
from typing import Listclass Solution: def findDifference(self, nums1: List[int], nums2: List[int]) -> List[List[int]]: s1, s2 = set(nums1), set(nums2) return [list(s1 - s2), list(s2 - s1)]复杂度
- 时间:O(n + m),建两个集合各扫一遍,再各遍历集合一次,集合查找 O(1)
- 空间:O(n + m),两个哈希集合最多各存下全部不同元素
易错点
面试追问把动画讲成自己的话
追问为什么用哈希集合而不是排序后双指针?
追问能不能只用一个集合?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
字母异位词分组
LeetCode 49 · 中等 · 沿着 哈希套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题