哈希表
一.看到题目有这些词,直接上哈希:
- 要找配对:用
need = 目标 - 当前数。 - 要计数、去重:用 key 存元素,value 记数。
- 数组管顺序,哈希管查找,两个搭配做题无敌。
- 找两个数、互补、求和
- 判断是否重复
- 统计出现次数
- 找交集、找相同元素
- 不想写双层循环、怕超时
Python 刷题,哈希 = 字典 {}。
二.哈希 三大必考模板(小白直接背、直接套、零理解压力)
我只写最简版本,注释全是白话,超级好理解(⊙o⊙)对应三种题型:
- 配对查找(两数之和类)
- 计数统计(字符/数字出现次数)
- 去重判重(有没有重复、是否出现过)
✅ 两数之和固定模板(你直接背)
模板一:配对查找模板(两数之和 必考)
适用场景
找两个数、互补求和、找另一半
核心逻辑
key=数组数字,value=数字下标
# 1. 创建哈希表
hash_map = {}
# 2. 遍历数组,带下标
for idx, num in enumerate(nums):
# 算出我需要的另一半数字
need = target - num
# 3. 哈希查找:另一半之前存过吗?
if need in hash_map:
# 找到了,直接返回答案下标
return [hash_map[need], idx]
# 4. 没找到,把当前数字存进哈希,留给后面用
hash_map[num] = idx
✅ 记忆:
need = 目标 - 当前数
key存数字,value存下标
✅ 频次统计固定模板(你直接背)
模板二:计数统计模板(高频:异位词、赎金信)
适用场景
统计数字/字母 出现多少次
核心逻辑
key=元素,value=出现次数
# 1. 空哈希表
count_map = {}
# 2. 遍历每一个元素
for item in nums:
if item in count_map:
# 已经存在,次数+1
count_map[item] += 1
else:
# 第一次出现,初始次数=1
count_map[item] = 1
简化简写(Python 懒人版,一样好用):
count_map = {}
for item in nums:
count_map[item] = count_map.get(item, 0) + 1
✅ 记忆:
key存要统计的东西,value存次数
✅ 去重 / 判重固定模板(你直接背)
模板三:去重 / 判重模板(重复元素、数组交集)
适用场景
判断有没有重复、筛选不重复元素
核心逻辑
key=元素,value随便存(标记存在过)
# 1. 空哈希
exist_map = {}
for item in nums:
# 2. 判断:之前有没有出现过
if item in exist_map:
# 重复了
print("存在重复")
else:
# 第一次出现,标记存起来
exist_map[item] = True
✅ 记忆:
key当黑名单,见过就存,下次再遇见就是重复
终极大白话总结(其实是博主自己有点记不住,写出来鼓励自己的)
- 找两个数配对 → 模板一:key=数字,value=下标
- 数出现多少次 → 模板二:key=元素,value=次数
- 查有没有重复 → 模板三:key=元素,value=标记
以后所有哈希题,按这 4 步走,不用自己硬想逻辑
第一步:读题,只看一句话
看题目在问什么,三选一:
-
是不是要「找两个数凑总和」?
→ 套模板 1:配对查找(两数之和)
-
是不是要「统计出现几次、对比字母 / 数字数量」?
→ 套模板 2:计数统计
-
是不是要「查重复、去重、有没有出现过」?
→ 套模板 3:判重去重
第二步:锁定模板,直接复制整段代码
不要自己写,先完整复制
第三步:只改 2~3 个单词
比如:
nums 改成题目数组名
target 改成题目目标
别的全部不动
第四步:运行、看报错、微调
哪怕半抄半改,先过题,
过一道 → 懂一点 → 慢慢不用抄

浙公网安备 33010602011771号