id, title, type, domain, stack, tags, level, prerequisites, est_hours, related, week, order
| id |
title |
type |
domain |
stack |
tags |
level |
prerequisites |
est_hours |
related |
week |
order |
| cs.algorithms.complexity-patterns |
复杂度分析和九个高频模式:哈希、滑动窗口、二分、堆、BFS、拓扑排序、动态规划、LRU、区间合并 |
lesson |
cs |
|
| 时间复杂度 |
| 哈希表 |
| 滑动窗口 |
| 二分查找 |
| 堆 |
| Top K |
| BFS |
| DFS |
| 拓扑排序 |
| 动态规划 |
| LRU |
|
basic |
|
6 |
| cs.algorithms.scenario.business-algorithms |
| cs.algorithms.interview |
|
|
1 |
复杂度分析和九个高频模式:哈希、滑动窗口、二分、堆、BFS、拓扑排序、动态规划、LRU、区间合并
BOSS直聘 2026-10-23 的调研中有少数岗位明确提到算法 / 数据结构基础,笔试和一面中出现手写题的情况也不少。目标不是刷几百题,而是掌握模式、能讲复杂度、写出无 bug 的中等题。练习平台可用 LeetCode 中国站(力扣)。
解释说明
复杂度
| 复杂度 |
典型操作 |
n = 10⁶ 时的感受 |
| O(1) |
哈希表查找、数组下标 |
瞬间 |
| O(log n) |
二分查找、堆操作 |
约 20 步 |
| O(n) |
遍历 |
很快 |
| O(n log n) |
排序 |
可以接受 |
| O(n²) |
双重循环 |
太慢(10¹² 次) |
面试时先说暴力解及其复杂度,再优化,最后说明时间和空间复杂度。
九个模式(何时想到它)
| 模式 |
信号 |
例题 |
| 哈希表 |
“是否出现过”、“计数”、“配对” |
两数之和 |
| 滑动窗口 |
连续子数组 / 子串 + 最长 / 最短 |
无重复字符的最长子串 |
| 二分查找 |
有序、单调、“第一个满足条件的” |
lower_bound、搜索旋转数组 |
| 堆 |
Top K、动态取最值、合并 K 个有序 |
前 K 个高频元素 |
| BFS |
最短步数、层序遍历 |
网格最短路径 |
| DFS / 拓扑排序 |
依赖关系、是否有环、所有方案 |
课程表 |
| 动态规划 |
最优值 / 方案数、子问题重叠 |
编辑距离、爬楼梯、背包 |
| 设计题 |
要求 O(1) 操作 |
LRU 缓存 |
| 排序 + 扫描 |
区间、会议室 |
合并区间 |
答题步骤
- 复述题目,问清边界(空输入、重复、负数、数据规模);
- 说思路和复杂度,得到认可后再写;
- 写代码时变量命名清楚;
- 用一两个例子手动走一遍,包括边界;
- 说明可以改进的地方。
案例
这些模式在业务中经常出现:热门问题统计(堆)、限流的滑动窗口、任务编排的依赖顺序(拓扑排序,LangGraph / CI 流水线都用到)、文本纠错与相似度(编辑距离)、缓存淘汰(LRU)、排班时间段合并(区间合并)。见企业场景。
代码示例
examples/patterns:9 个模式的实现 + 13 个测试(其中二分查找与标准库 bisect 随机对拍 200 次)。
滑动窗口:
二分查找(左闭右开,最不容易写错的模板):
易错点
- 二分查找的区间定义混乱(左闭右闭和左闭右开混用),导致死循环或越界。
- 滑动窗口中,重复字符在窗口左边界之外时也移动左边界(例如 "abba")。
- BFS 出队时才标记已访问,导致同一个节点多次入队。
- 递归 DFS 在深度很大时栈溢出(Python 默认递归深度约 1000)。
- 只写出代码不说复杂度。
面试常问
- 手写:两数之和、最长无重复子串、二分查找、Top K、LRU、合并区间、课程表、编辑距离 / 爬楼梯。
- 哈希表的原理和冲突处理?
- 快速排序的平均和最坏复杂度?