图解题库 / 哈希

217. 存在重复元素

简单 含交互动画

学完这道你应该能: 说清它为什么用「哈希」,而不是死记步骤; 合上页面,自己默写出核心代码; 用 30 秒把思路讲清楚。

题目描述

数组中只要存在任一值出现两次就返回 true,否则 false。

nums = [1, 2, 3, 1]
输出 = true (1 出现两次)

思路解析

每个数和后面所有数比一遍,n² 太慢。用哈希集合:扫到一个数,先查「见过没」,没见过就记下来,O(n) 一遍搞定。

维护一个集合 seen。每到一个数 x:若 x 已在 seen 里 → 找到重复,返回 true;否则把 x 加进 seen,继续。

i=0 · 看 1:第一个数 1,seen 里没有,记下:seen = {1}。

i=1 · 看 2:2 没见过,加入:seen = {1, 2}。

i=2 · 看 3:3 没见过,加入:seen = {1, 2, 3}。

i=3 · 看 1 · 撞上!:又是 1——它已经在 seen 里!发现重复,立刻返回 true

「是否出现过 / 有没有重复 / 是否存在」一律用哈希集合 O(1) 查存。这是最基础也最常用的一招。

参考代码(Python)

Python
1seen = set()
2for x in nums:
3    if x in seen: return True      # 见过 = 重复
4    seen.add(x)                    # 没见过就记下
5return False

复杂度分析

  • 时间复杂度:O(n) —— 扫一遍,查/存 O(1)
  • 空间复杂度:O(n) —— 集合最多存 n 个

套路模板

记住骨架:遍历时先查 seen、命中就处理、否则加入。两数之和、最长无重复子串、快乐数都靠它。

Python
1seen = set()
2for x in 数据:
3    if x in seen: ...              # 命中(重复/找到)
4    seen.add(归一化(x))            # 记录

易错点

  • 先 add 再判断 → ✅ 先判 in seen,再 add(顺序反了会把自己当成"重复")
  • 用 list 做 seen → ✅ 用 set(哈希)(list 的 in 是 O(n),会退化成 O(n²))

以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握

下一题 →206. 反转链表 ← 返回题库