哈希表解决两数之和的核心是“边遍历、边查、边存”:以元素值为key、索引为value存入哈希表;每步计算complement = target - nums[i],先查表是否存在complement,存在则返回对应索引和i,否则存入nums[i]→i;该顺序避免自匹配,时间复杂度o(n)。

哈希表解决两数之和的核心在于“边遍历、边查、边存”,用空间换时间,把查找操作从 O(n) 降到 O(1),整体时间复杂度优化为 O(n)。
哈希表怎么存:键值对设计是关键
不是随便存,而是有明确分工:
- 键(key)存元素值:比如 nums[i] = 7,就以 7 作为 key;这样后续能直接用 complement = target - 当前值 去查是否存在
- 值(value)存索引位置:比如 7 出现在下标 1,就把 1 存为 value;一旦匹配成功,立刻拿到两个下标,不用再回溯找
- 重复元素无需特殊处理:题目保证唯一解,且后出现的相同值会覆盖前一个索引——这不影响结果,因为只要找到一对即可
查找逻辑怎么走:一次遍历完成全部判断
不等遍历完才开始查,而是在每一步都做两件事:
- 算出当前数的互补数:complement = target - nums[i]
- 立即查哈希表里有没有这个 complement:
- 有 → 直接返回 [complement 对应的索引, i]
- 没有 → 把 nums[i] → i 存进哈希表,继续下一个
这种“先查后存”的顺序避免了自己和自己配对(比如 target=6, nums=[3,3],第一个 3 还没存,查 complement=3 就找不到;等第二个 3 进来时,第一个 3 已在表中,正好匹配)。
语言实现要注意的细节
不同语言封装程度不同,但底层逻辑一致:
- Python/Java/C++(带标准库):直接用 dict / HashMap / unordered_map,关注 insert 和 containsKey / get 操作是否常数时间
- C 语言(无内置哈希):需手动实现链地址法或开放寻址法;常用做法是定义结构体 + 哈希函数(如 key % 表长)+ 冲突处理(拉链或线性探测)
- 哈希表大小建议预留足够空间(如数组长度的 2 倍),减少冲突;若用数组模拟,注意负数索引需偏移(如加 10⁵)
为什么比暴力快:时间复杂度对比直观
假设数组长度为 n:
- 暴力法:两层 for 循环,最坏要试 n×(n−1)/2 次 → O(n²)
- 哈希法:只遍历一遍数组,每次做一次哈希查找 + 一次插入(平均 O(1))→ O(n)
- 当 n = 10⁴ 时,O(n²) 是 1 亿次操作,O(n) 是 1 万次,差距超 4 个数量级











