字典 / 哈希
共 31 条分类条目,3 个题型小节; 每行标注难度、题号、原笔记摘要和 LeetCode 链接。
一、哈希表基础应用(HashMap/HashSet)
15 条类型特点:哈希表的核心能力是 O(1) 平均时间复杂度的插入、删除和查找。常用于:
| 难度 | 题目 | 核心思路(原笔记摘要) |
|---|---|---|
| 简单 | LeetCode ↗ | 用 Map 存储元素值和下标,遍历时查找 target - nums[i] |
| 简单 | 217. 存在重复元素#217 LeetCode ↗ | 用 Set 判断是否有重复元素 |
| 简单 | 242. 有效的字母异位词#242 LeetCode ↗ | 统计两字符串字符频率是否相同 |
| 简单 | 349. 两个数组的交集#349 LeetCode ↗ | 用 Set 存储一个数组,遍历另一个数组判断是否存在 |
| 简单 | 383. 赎金信#383 LeetCode ↗ | 用 Map 统计 magazine 字符出现次数,检查 ransomNote 是否够用 |
| 简单 | 202. 快乐数#202 LeetCode ↗ | 用 Set 记录出现过的数,判断是否进入循环 |
| 简单 | LeetCode ↗ | 可用 Set(出现两次则删除),但更优解是异或 |
| 中等 | LeetCode ↗ | 将排序后的字符串作为 Map 的键,分组存储 |
| 中等 | LeetCode ↗ | 用 Map 存储字符最近出现的位置,滑动窗口时更新左边界 |
| 中等 | 347. 前 K 个高频元素#347 LeetCode ↗ | 先用 Map 统计频率,再用优先队列(堆)取 Top K |
| 中等 | 560. 和为 K 的子数组#560 LeetCode ↗ | 前缀和 + Map 优化,Map 存储前缀和出现的次数 |
| 中等 | 205. 同构字符串#205 LeetCode ↗ | 建立双向映射关系,两个 Map 分别存储 s->t 和 t->s 的映射 |
| 中等 | 290. 单词规律#290 LeetCode ↗ | 类似同构字符串,建立 pattern->word 和 word->pattern 的双向映射 |
| 中等 | 454. 四数相加 II#454 LeetCode ↗ | 将前两个数组的和存入 Map 计数,遍历后两个数组查找补数 |
| 中等 | 36. 有效的数独#36 LeetCode ↗ | 用三个二维数组或 Set 记录行、列、九宫格中已出现的数字 |
- 简单#1站内精讲
用 Map 存储元素值和下标,遍历时查找 target - nums[i]
- 简单#217
用 Set 判断是否有重复元素
- 简单#242
统计两字符串字符频率是否相同
- 简单#349
用 Set 存储一个数组,遍历另一个数组判断是否存在
- 简单#383
用 Map 统计 magazine 字符出现次数,检查 ransomNote 是否够用
- 简单#202
用 Set 记录出现过的数,判断是否进入循环
- 简单#136站内精讲
可用 Set(出现两次则删除),但更优解是异或
- 中等#49站内精讲
将排序后的字符串作为 Map 的键,分组存储
- 中等#3站内精讲
用 Map 存储字符最近出现的位置,滑动窗口时更新左边界
- 中等#347
先用 Map 统计频率,再用优先队列(堆)取 Top K
- 中等#560
前缀和 + Map 优化,Map 存储前缀和出现的次数
- 中等#205
建立双向映射关系,两个 Map 分别存储 s->t 和 t->s 的映射
- 中等#290
类似同构字符串,建立 pattern->word 和 word->pattern 的双向映射
- 中等#454
将前两个数组的和存入 Map 计数,遍历后两个数组查找补数
- 中等#36
用三个二维数组或 Set 记录行、列、九宫格中已出现的数字
二、字典树(Trie/前缀树)
12 条类型特点:字典树是一种树型结构,用于处理字符串前缀相关的问题。核心操作是插入和查找,时间复杂度 O(len(key))。适用于:
| 难度 | 题目 | 核心思路(原笔记摘要) |
|---|---|---|
| 中等 | LeetCode ↗ | 实现 Trie 的 insert、search、startsWith 方法 |
| 中等 | LeetCode ↗ | Trie + DFS 处理通配符 '.' 的匹配 |
| 困难 | 212. 单词搜索 II#212 LeetCode ↗ | Trie + 回溯,将单词存入 Trie,在矩阵中 DFS 搜索 |
| 中等 | 648. 单词替换#648 LeetCode ↗ | 将词根存入 Trie,遍历句子中的单词查找最短词根替换 |
| 中等 | 677. 键值映射#677 LeetCode ↗ | Trie 节点存储值,insert 时更新路径上的前缀和 |
| 中等 | 720. 词典中最长的单词#720 LeetCode ↗ | 将单词存入 Trie,DFS 查找所有前缀都存在的单词 |
| 困难 | 472. 连接词#472 LeetCode ↗ | Trie + DFS + 记忆化,判断单词是否由其他单词组成 |
| 中等 | 820. 单词的压缩编码#820 LeetCode ↗ | 将单词反转后存入 Trie,统计叶子节点深度和 |
| 困难 | 1032. 字符流#1032 LeetCode ↗ | 构建后缀 Trie(反向插入),在字符流中匹配历史查询 |
| 中等 | 1268. 搜索推荐系统#1268 LeetCode ↗ | Trie + DFS,每输入一个前缀返回前 3 个推荐单词 |
| 中等 | 1233. 删除子文件夹#1233 LeetCode ↗ | 将文件夹路径存入 Trie,标记结束节点,DFS 收集完整路径 |
| 中等 | 676. 实现一个魔法字典#676 LeetCode ↗ | Trie + DFS,搜索时允许一次字符不匹配 |
- 中等#208
实现 Trie 的 insert、search、startsWith 方法
- 中等#211
Trie + DFS 处理通配符 '.' 的匹配
- 困难#212
Trie + 回溯,将单词存入 Trie,在矩阵中 DFS 搜索
- 中等#648
将词根存入 Trie,遍历句子中的单词查找最短词根替换
- 中等#677
Trie 节点存储值,insert 时更新路径上的前缀和
- 中等#720
将单词存入 Trie,DFS 查找所有前缀都存在的单词
- 困难#472
Trie + DFS + 记忆化,判断单词是否由其他单词组成
- 中等#820
将单词反转后存入 Trie,统计叶子节点深度和
- 困难#1032
构建后缀 Trie(反向插入),在字符流中匹配历史查询
- 中等#1268
Trie + DFS,每输入一个前缀返回前 3 个推荐单词
- 中等#1233
将文件夹路径存入 Trie,标记结束节点,DFS 收集完整路径
- 中等#676
Trie + DFS,搜索时允许一次字符不匹配
三、综合应用(哈希表 + 其他数据结构)
4 条类型特点:哈希表与其他数据结构结合,实现更复杂的功能:
| 难度 | 题目 | 核心思路(原笔记摘要) |
|---|---|---|
| 中等 | 146. LRU 缓存#146 LeetCode ↗ | 哈希表 + 双向链表实现 O(1) 的 get 和 put |
| 中等 | LeetCode ↗ | 哈希表 + 动态数组,哈希表存储值到数组下标的映射 |
| 困难 | 895. 最大频率栈#895 LeetCode ↗ | 哈希表记录频率到对应元素栈的映射,以及元素到频率的映射 |
| 中等 | 355. 设计推特#355 LeetCode ↗ | 哈希表 + 优先队列(堆)实现推文推送 |
- 中等#146
哈希表 + 双向链表实现 O(1) 的 get 和 put
- 中等#380
哈希表 + 动态数组,哈希表存储值到数组下标的映射
- 困难#895
哈希表记录频率到对应元素栈的映射,以及元素到频率的映射
- 中等#355
哈希表 + 优先队列(堆)实现推文推送