题号: 1
难度: 简单
专题: 哈希
created: 2026-08-20
1. 两数之和
一句话本质
找互补数,不是枚举所有数对,而是边遍历边查哈希表里有没有当前数的补数。
题目
给定整数数组 nums 和目标值 target,找出和为 target 的两个数的下标。假设只有唯一解,同一个元素不能用两次。
思路(从暴力到最优)
- 暴力:两层循环枚举所有数对 (i, j),O(n²)。浪费在"我已经见过的数没记住"。
- 优化:遍历时,把每个数的"补数"记下来——我需要
target - x,那就问哈希表:你之前存过这个值吗?存了就返回,没存就把当前数和下标登记进去。 - 为什么是哈希表:O(1) 查找,"你有没有见过它"不需要再扫一遍数组。
关键卡点
我当时卡在这
- 先存
dict[x] = i再查会导致自己和自己匹配。比如target=6, nums=[3, ...],先把 3 存进去,立刻查到6-3=3在 dict 里,返回两个相同下标。- 正确顺序:先查,后存。
代码
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dict = {}
for i, x in enumerate(nums):
# 先查后存
if target - x in dict:
# 返回对应数组下标
return [dict[target - x], i]
dict[x] = i
复杂度
- 时间:O(n),一趟遍历
- 空间:O(n),哈希表最多存 n 个元素
一句话记忆点
下次看到类似题
"两数之和 → 边遍历边查哈希表,先查后存,防自匹配。"
相似题 / 套用模板
-
- 三数之和(排序 + 双指针,因为不用返回下标)
-
- 两数之和 II(有序数组,双指针)