一、问题描述

二、解题代码
解法一、暴力
python
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
n = len(nums)
for i in range(n):
for j in range(i+1,n):
if nums[i]+nums[j] == target:
s = [i,j]
return s
解法二、哈希
python
from typing import List
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hash_dict = {} # 空字典,格式 {数字:下标}
for idx, num in enumerate(nums):
need = target - num # 算出需要配对的数字
# 判断需要的数字,之前有没有遍历到
if need in hash_dict:
# hash_dict[need] = 配对数字的下标
# idx = 当前数字的下标
return [hash_dict[need], idx]
# 没找到配对,把当前数字和下标存入字典
hash_dict[num] = idx
小技巧:字典【数字:下标】
新建的字典中,把需要的数字当作下标存储,而该字典的值为原数列的下标。
例:
- i=0, num=2,need=7,字典无 7 → 执行
hash_dict[2] = 0 - i=1, num=7,need=2,字典存在 2 → 取出
hash_dict[2]=0,直接得到答案
为什么要存 数字:下标?
- 查询速度极快:字典查找是 O (1),暴力两层循环是 O (n²)
- 反向存储:把 "值" 作为 key,下标作为 value,通过目标差值反向定位历史下标
- 避免二次循环:每走一个元素只做一次减法 + 一次查表,一遍数组就能解完
三、区别:
-
你的暴力双层循环 固定第 i 个数字,只和 它后面所有数字 j(j>i) 配对求和,往后找。两层循环,重复计算多,效率低。
-
哈希字典单层循环 走到第 idx 个数字时,只去字典查 它前面所有数字(前面的已经提前存进字典里),往前找互补数。只遍历数组一次,前面的数据存在字典里快速查询,不用重复循环。
补充关键优势:为什么 "往前找" 更快?
暴力法:每一个数字都要和后面全部数字比对,总比对次数 n*(n-1)/2,数组越长越卡。哈希法:每个数字只做一次减法、一次字典查询(查询速度近似瞬间完成),全程只走一遍数组。
举同一个例子印证逻辑 nums=[2,7,11,15], target=9
- 暴力:i=0(数字 2),依次和 j=1、j=2、j=3 相加,到 j=1 匹配成功。
- 哈希:走到 idx=1(数字 7),往前查已存入字典的数字 2,直接匹配成功。
补充避坑点
哈希代码里先判断、再存入,就是为了保证永远只查前面的数字,绝对不会取到当前自身,完美满足题目 "不能使用两次相同元素" 的限制。