题目描述
思路解析动画文字版
核心就一个集合 seen:来一个数先查再存。查到已存在 = 重复,直接收工;全扫完没查到 = 没有重复。
开始扫描前:集合 seen 是空的,指针 i 还没出发,去找有没有重复。
指针 i 走到下标 0,值是 5。先去集合 seen 里查一下 5 之前出现过没有。
查的结果是:集合 seen 里还没有 5,所以 5 是第一次出现,不算重复。
把 5 放进集合 seen(高亮新增那行),这样以后再遇到 5 就能查出来。继续扫下一个。
指针 i 走到下标 1,值是 9。先去集合 seen 里查一下 9 之前出现过没有。
查的结果是:集合 seen 里还没有 9,所以 9 是第一次出现,不算重复。
把 9 放进集合 seen(高亮新增那行),这样以后再遇到 9 就能查出来。继续扫下一个。
指针 i 走到下标 2,值是 3。先去集合 seen 里查一下 3 之前出现过没有。
查的结果是:集合 seen 里还没有 3,所以 3 是第一次出现,不算重复。
把 3 放进集合 seen(高亮新增那行),这样以后再遇到 3 就能查出来。继续扫下一个。
指针 i 走到下标 3,值是 7。先去集合 seen 里查一下 7 之前出现过没有。
查的结果是:集合 seen 里还没有 7,所以 7 是第一次出现,不算重复。
把 7 放进集合 seen(高亮新增那行),这样以后再遇到 7 就能查出来。继续扫下一个。
指针 i 走到下标 4,值是 1。先去集合 seen 里查一下 1 之前出现过没有。
查的结果是:集合 seen 里还没有 1,所以 1 是第一次出现,不算重复。
把 1 放进集合 seen(高亮新增那行),这样以后再遇到 1 就能查出来。继续扫下一个。
指针 i 走到下标 5,值是 8。先去集合 seen 里查一下 8 之前出现过没有。
查的结果是:集合 seen 里还没有 8,所以 8 是第一次出现,不算重复。
把 8 放进集合 seen(高亮新增那行),这样以后再遇到 8 就能查出来。继续扫下一个。
指针 i 走到下标 6,值是 9。先去集合 seen 里查一下 9 之前出现过没有。
集合里已经有 9 了(高亮那行),说明 9 前面来过一次,这次是第二次——找到重复,立刻返回 true。
整趟扫到下标 6 就提前结束了:9 是第二次出现,所以答案是 true——数组里存在重复元素。
三个高频追问:集合存什么、无重复时怎么走、以及排序法这个省空间的替代解。
参考代码
def containsDuplicate(nums): seen = set() # 记录见过的值 for x in nums: if x in seen: # 已经见过 → 重复 return True seen.add(x) # 没见过 → 存进去 return False # 全程没撞上复杂度
- 时间:O(n),数组从头扫到尾,每个数的「查 + 存」在集合里都接近常数时间
- 空间:O(n),最坏情况(全不重复)集合要装下所有 n 个数
易错点
面试追问把动画讲成自己的话
追问集合 seen 里到底存的是什么?
追问如果数组本身就没有重复,会怎么走?
追问除了集合,还有别的解法吗?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
有效的字母异位词
LeetCode 242 · 简单 · 沿着 数组 & 哈希 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题