题目描述
思路解析动画文字版
暴力法的麻烦点正是“查找慢”和“去重麻烦”。集合一次解决这两个问题。
不变量:s1 保存 nums1 出现过的唯一值;ans 保存已经确认属于交集的唯一值。
初始化:两个集合都为空:动画上半段处理 nums1 的输入,建立 s1;下半段处理 nums2 的输入,查 s1 并更新 ans。
读 nums1[0]=1:加入 s1:集合里还没有 1,把 1 加进去。之后查 1 是否出现过就是 O(1) 平均时间。
读 nums1[1]=2:加入 s1:2 也加入 s1。到这里,nums1 里出现过的候选交集值已经有 1 和 2。
读 nums1[2]=2:重复,集合不变:这就是集合的第一层去重:nums1 里有两个 2,但 s1 里只保留一个 2。
读 nums1[3]=1:重复,集合仍不变:nums1 扫完后,s1={1,2}。接下来扫描 nums2,只需要判断每个 x 是否在 s1 里。
读 nums2[0]=2:x 在 s1 中,加入 ans:nums2 的第一个 2 在 s1 里,说明两个数组都出现过 2,把它加入结果集合 ans。
读 nums2[1]=2:x 仍在 s1 中,但 ans 不重复:nums2 里也有两个 2,但 ans 是集合,所以第二次 add(2) 不会产生重复答案。
返回 list(ans):顺序不重要:最终 ans 只有一个元素 2。题目不要求顺序,所以把集合转成列表返回即可。
这题的可迁移点是:先用一个集合保存“出现过”,再用另一个集合保存“确认命中且不重复”。
参考代码
class Solution: def intersection(self, nums1, nums2): s1 = set(nums1) ans = set() for x in nums2: if x in s1: ans.add(x) return list(ans)复杂度
- 时间复杂度:O(m+n),m=len(nums1), n=len(nums2)。建 s1 扫 nums1,查交集扫 nums2。
- 空间复杂度:O(m+n),s1 和 ans 最多保存两个数组中的不同元素。
易错点
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
最长回文串
LeetCode 409 · 简单 · 沿着 哈希套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题