队列算法题分类解析
1. 基础实现与栈混合类
类型特点:考察对队列(FIFO)和栈(LIFO)核心特性的理解。通常要求用栈实现队列,或者用队列实现栈,掌握这两种数据结构的相互转换。
| 难度 | 题目 | 核心思路简介 |
|---|---|---|
| 简单 | 232. 用栈实现队列 | 使用两个栈(输入栈 + 输出栈),输出栈为空时将输入栈全部倒入输出栈 |
| 简单 | 225. 用队列实现栈 | 使用一个或两个队列,将队尾元素移到队首(弹出前将前 n-1 个元素重新入队) |
2. 优先队列(堆)类
类型特点:优先队列(Priority Queue)在力扣中通常用堆(Heap) 实现。用于解决需要动态获取最大值/最小值的场景,如 Top K 问题、数据流中位数、任务调度等。
| 难度 | 题目 | 核心思路简介 |
|---|---|---|
| 中等 | 347. 前 K 个高频元素 | 哈希表统计频率 + 最小堆维护 Top K |
| 中等 | 215. 数组中的第K个最大元素 | 维护一个大小为 K 的最小堆,或使用快速选择 |
| 困难 | 295. 数据流的中位数 | 维护两个堆:最大堆存左半部分,最小堆存右半部分 |
| 中等 | 621. 任务调度器 | 贪心 + 最大堆模拟任务调度 |
| 困难 | 23. 合并K个升序链表 | 将每个链表的头节点放入优先队列,每次弹出最小值节点 |
3. 单调队列类
类型特点:队列中的元素保持单调性(递增或递减)。用于解决滑动窗口最值问题,可以在 O(1) 时间内获取窗口内的最大值或最小值。
| 难度 | 题目 | 核心思路简介 |
|---|---|---|
| 困难 | 239. 滑动窗口最大值 | 维护一个单调递减队列,队首始终为当前窗口最大值 |
| 困难 | 480. 滑动窗口中位数 | 维护两个堆(平衡二叉搜索树),滑动窗口时动态调整 |
4. 广度优先搜索(BFS)类
类型特点:队列是 BFS 的核心数据结构。用于层级遍历、最短路径、拓扑排序等问题。树的层次遍历也是队列的经典应用 。
| 难度 | 题目 | 核心思路简介 |
|---|---|---|
| 中等 | 102. 二叉树的层序遍历 | 使用队列逐层存储节点,记录每层大小 |
| 中等 | 200. 岛屿数量 | BFS/DFS 遍历二维数组,遇到 '1' 将其周围所有 '1' 入队标记 |
| 中等 | 207. 课程表 | 拓扑排序(BFS 版),统计入度,将入度为 0 的节点入队 |
| 困难 | 126. 单词接龙 II | BFS 构建图 + DFS 找出所有最短路径 |
5. 双端队列(Deque)类
类型特点:双端队列允许在两端进行插入和删除操作。常用于需要两端操作的场景,或实现单调队列。
| 难度 | 题目 | 核心思路简介 |
|---|---|---|
| 中等 | 641. 设计循环双端队列 | 使用数组实现,维护头尾指针,处理边界循环 |
| 中等 | 1438. 绝对差不超过限制的最长连续子数组 | 使用两个双端队列分别维护窗口最大值和最小值 |
6. 队列简单应用类
类型特点:直接考察队列的基础操作,如入队、出队、循环队列等。
| 难度 | 题目 | 核心思路简介 |
|---|---|---|
| 简单 | 933. 最近的请求次数 | 使用队列存储请求时间,剔除超出时间范围的老请求 |
| 中等 | 622. 设计循环队列 | 使用数组和头尾指针,处理队列满和空的判断 |
刷题建议
- 基础先行:从 232. 用栈实现队列 和 225. 用队列实现栈 入手,理解两种数据结构的本质区别。
- 掌握 BFS:队列最广泛的应用是 BFS,建议练习 102. 二叉树的层序遍历 和 200. 岛屿数量,这是面试高频题。
- 攻克单调队列:如果时间充裕,挑战 239. 滑动窗口最大值,这道题能帮助你深刻理解单调队列的优化思想。
- 熟悉优先队列:堆(优先队列)在后续的图论、动态规划优化中会频繁用到,建议掌握 347. 前 K 个高频元素 的堆解法。