》——算法工程师笔试机试通关指南)
《数据结构与算法Python版》——算法工程师笔试机试通关指南目标人群准备算法工程师笔试/机试的开发者核心理念每个知识点配 LeetCode 实战通俗易懂 面试高频第1讲数据结构与时间和空间复杂度核心内容什么是数据结构为什么算法工程师必须精通时间复杂度O(1)、O(log n)、O(n)、O(n log n)、O(n²)、O(2ⁿ) 的直观理解空间复杂度额外空间 vs 原地修改大O表示法的最坏情况思维通俗比喻时间复杂度就像排队买单——O(1)是VIP通道O(n)是普通排队O(n²)是每个人都和前面所有人打招呼。LeetCode实战LC 1. 两数之和 —— 哈希表优化 O(n²)→O(n)LC 217. 存在重复元素 —— 时空复杂度权衡第2讲数组Array核心内容数组的内存连续特性与随机访问 O(1)动态数组Python List的扩容机制数组的增删改查时间复杂度分析前缀和、差分数组技巧LeetCode实战LC 53. 最大子数组和 —— 前缀和/动态规划入门LC 238. 除自身以外数组的乘积 —— 双指针技巧LC 560. 和为K的子数组 —— 前缀和哈希表LC 189. 轮转数组 —— 数组翻转技巧第3讲栈Stack核心内容栈的LIFO特性与应用场景单调栈寻找下一个更大/更小元素栈与递归的关系调用栈Python中用List实现栈LeetCode实战LC 20. 有效的括号 —— 栈的基础应用LC 155. 最小栈 —— 辅助栈设计LC 739. 每日温度 —— 单调栈经典LC 84. 柱状图中最大的矩形 —— 单调栈难题LC 394. 字符串解码 —— 栈处理嵌套结构第4讲队列Queue核心内容队列的FIFO特性双端队列Deque与滑动窗口优先队列堆与单调队列collections.deque 的使用LeetCode实战LC 232. 用栈实现队列LC 239. 滑动窗口最大值 —— 单调队列经典LC 622. 设计循环队列LC 933. 最近的请求次数 —— 滑动窗口应用第5讲链表Linked List核心内容单链表、双链表的结构与操作虚拟头结点技巧Dummy Node快慢指针找中点、判环链表反转的三种方法迭代、递归、头插法LeetCode实战LC 206. 反转链表 —— 必会基础LC 141. 环形链表 —— 快慢指针判环LC 142. 环形链表 II —— 找环入口LC 21. 合并两个有序链表LC 83. 删除排序链表中的重复元素LC 19. 删除链表的倒数第 N 个结点 —— 快慢指针LC 148. 排序链表 —— 归并排序思想LC 23. 合并K个升序链表 —— 优先队列第6讲递归与回溯Recursion Backtracking核心内容递归三要素终止条件、递归关系、返回值递归树与状态空间回溯法框架选择→递归→撤销剪枝优化技巧LeetCode实战LC 509. 斐波那契数 —— 递归入门LC 70. 爬楼梯 —— 递归记忆化LC 46. 全排列 —— 回溯经典LC 78. 子集 —— 回溯/位运算LC 17. 电话号码的字母组合LC 39. 组合总和LC 79. 单词搜索 —— 二维回溯LC 51. N 皇后 —— 回溯难题LC 200. 岛屿数量 —— DFS Flood Fill第7讲树与二叉树Tree Binary Tree核心内容二叉树的定义与性质满二叉树、完全二叉树、BST四种遍历前序、中序、后序、层序递归 vs 迭代实现遍历二叉搜索树BST的查找、插入、删除平衡二叉树AVL与红黑树概念LeetCode实战LC 144. 二叉树的前序遍历LC 94. 二叉树的中序遍历LC 145. 二叉树的后序遍历LC 102. 二叉树的层序遍历LC 104. 二叉树的最大深度LC 226. 翻转二叉树LC 98. 验证二叉搜索树LC 230. 二叉搜索树中第K小的元素LC 236. 二叉树的最近公共祖先LC 124. 二叉树中的最大路径和 —— 后序遍历经典第8讲堆Heap / Priority Queue核心内容堆的定义大顶堆、小顶堆堆的插入与删除上浮、下沉操作Python heapq 模块使用Top-K 问题的通用解法LeetCode实战LC 215. 数组中的第K个最大元素 —— 快速选择/堆LC 347. 前 K 个高频元素LC 23. 合并K个升序链表 —— 优先队列LC 295. 数据流的中位数 —— 双堆技巧LC 253. 会议室 II —— 最小堆应用第9讲排序算法Sorting核心内容十大排序算法总览与复杂度对比快速排序分区思想、三路快排归并排序分治思想、逆序对计数堆排序原地排序计数排序、桶排序非比较排序Python sorted() 与 sort() 的 Timsort 原理LeetCode实战LC 912. 排序数组 —— 手写快排/归并LC 148. 排序链表 —— 归并排序LC 75. 颜色分类 —— 三路快排荷兰国旗LC 315. 计算右侧小于当前元素的个数 —— 归并排序变形LC 164. 最大间距 —— 桶排序第10讲二分搜索Binary Search核心内容二分搜索的模板与边界处理左闭右闭 vs 左闭右开查找目标值、查找左边界、查找右边界二分答案将求解问题转化为判定问题旋转数组中的二分搜索LeetCode实战LC 704. 二分查找 —— 基础模板LC 35. 搜索插入位置LC 34. 在排序数组中查找元素的第一个和最后一个位置LC 33. 搜索旋转排序数组LC 153. 寻找旋转排序数组中的最小值LC 4. 寻找两个正序数组的中位数 —— 二分难题LC 875. 爱吃香蕉的珂珂 —— 二分答案第11讲哈希表Hash Table核心内容哈希函数、冲突解决链地址法、开放寻址法Python dict 与 set 的底层原理哈希表的应用去重、计数、快速查找一致性哈希分布式系统概念LeetCode实战LC 1. 两数之和LC 128. 最长连续序列 —— 哈希表 O(n)LC 49. 字母异位词分组LC 146. LRU 缓存 —— 哈希表双向链表LC 380. O(1) 时间插入、删除和获取随机元素第12讲双指针与滑动窗口Two Pointers Sliding Window核心内容对撞指针从两端向中间快慢指针链表、数组滑动窗口固定窗口 vs 可变窗口窗口收缩条件的设计LeetCode实战LC 167. 两数之和 II - 输入有序数组 —— 对撞指针LC 11. 盛最多水的容器LC 3. 无重复字符的最长子串 —— 滑动窗口经典LC 76. 最小覆盖子串 —— 滑动窗口难题LC 209. 长度最小的子数组LC 424. 替换后的最长重复字符第13讲字符串与KMP算法核心内容字符串匹配暴力法 → KMP优化前缀函数Partial Match Table的构建KMP的核心思想利用已匹配信息避免回退Python 字符串不可变性的影响LeetCode实战LC 28. 找出字符串中第一个匹配项的下标 —— KMPLC 214. 最短回文串 —— KMP变形LC 5. 最长回文子串 —— 中心扩展/动态规划LC 647. 回文子串第14讲广度优先搜索与深度优先搜索BFS DFS核心内容DFS递归实现、栈实现、回溯本质BFS队列实现、层序遍历、最短路径图的表示邻接表、邻接矩阵visited 数组与剪枝LeetCode实战LC 200. 岛屿数量 —— DFS/BFSLC 695. 岛屿的最大面积LC 133. 克隆图 —— BFS/DFSLC 127. 单词接龙 —— BFS最短路径LC 207. 课程表 —— 拓扑排序BFS/DFSLC 210. 课程表 II第15讲最短路径与最小生成树核心内容Dijkstra算法单源最短路径非负权Bellman-Ford算法负权边处理Floyd-Warshall算法多源最短路径Prim与Kruskal算法最小生成树并查集Union-FindLeetCode实战LC 743. 网络延迟时间 —— DijkstraLC 787. K 站中转内最便宜的航班 —— Bellman-FordLC 1584. 连接所有点的最小费用 —— 最小生成树LC 261. 以图判树 —— 并查集LC 684. 冗余连接 —— 并查集LC 547. 省份数量 —— 并查集/DFS第16讲动态规划Dynamic Programming核心内容DP三要素状态定义、状态转移、初始化记忆化搜索 vs 递推背包问题01背包、完全背包、多重背包线性DP、区间DP、状态压缩DP股票问题系列框架LeetCode实战LC 70. 爬楼梯 —— DP入门LC 198. 打家劫舍 —— 线性DPLC 416. 分割等和子集 —— 01背包LC 322. 零钱兑换 —— 完全背包LC 1143. 最长公共子序列LC 300. 最长递增子序列 —— 贪心二分优化LC 72. 编辑距离LC 121. 买卖股票的最佳时机 —— 股票系列LC 123. 买卖股票的最佳时机 IIILC 188. 买卖股票的最佳时机 IVLC 10. 正则表达式匹配 —— 二维DP难题LC 312. 戳气球 —— 区间DP第17讲贪心算法Greedy Algorithm核心内容贪心选择性质与最优子结构贪心 vs 动态规划的区别常见贪心策略排序、堆、区间调度贪心正确性证明思路LeetCode实战LC 455. 分发饼干 —— 贪心入门LC 435. 无重叠区间 —— 区间调度LC 56. 合并区间LC 122. 买卖股票的最佳时机 II —— 贪心LC 134. 加油站LC 406. 根据身高重建队列LC 179. 最大数 —— 自定义排序第18讲位运算Bit Manipulation核心内容位运算基础与、或、非、异或、移位常用技巧判断奇偶、交换变量、取最低位1位掩码与状态压缩n (n-1) 的妙用LeetCode实战LC 136. 只出现一次的数字 —— 异或LC 137. 只出现一次的数字 IILC 260. 只出现一次的数字 IIILC 191. 位1的个数LC 338. 比特位计数LC 190. 颠倒二进制位第19讲并查集Union-Find / Disjoint Set核心内容并查集的数据结构父指针数组路径压缩与按秩合并优化时间复杂度近似 O(α(n))应用连通分量、最小生成树KruskalLeetCode实战LC 547. 省份数量LC 684. 冗余连接LC 721. 账户合并LC 128. 最长连续序列 —— 并查集解法LC 1202. 交换字符串中的元素第20讲Trie树前缀树核心内容Trie树的结构与插入、搜索、前缀匹配压缩Trie与后缀树概念应用场景自动补全、拼写检查、IP路由LeetCode实战LC 208. 实现 Trie (前缀树)LC 212. 单词搜索 II —— Trie DFSLC 648. 单词替换LC 677. 键值映射第21讲线段树与树状数组Segment Tree Binary Indexed Tree核心内容树状数组Fenwick Tree单点更新、区间查询线段树区间更新、区间查询、懒标记应用场景区间求和、区间最值LeetCode实战LC 307. 区域和检索 - 数组可修改 —— 树状数组/线段树LC 315. 计算右侧小于当前元素的个数 —— 树状数组LC 327. 区间和的个数LC 732. 我的日程安排表 III —— 线段树第22讲设计题与系统设计思维核心内容面向对象设计原则常见设计模式在算法题中的应用数据结构设计LRU、LFU、Trie、跳表算法工程师面试中的系统设计要点LeetCode实战LC 146. LRU 缓存LC 460. LFU 缓存LC 355. 设计推特LC 380. O(1) 时间插入、删除和获取随机元素LC 432. 全 O(1) 的数据结构 算法工程师笔试高频考点速查表考点出现频率代表题目数组/双指针⭐⭐⭐⭐⭐LC1, LC15, LC11链表⭐⭐⭐⭐⭐LC206, LC21, LC141二叉树遍历⭐⭐⭐⭐⭐LC94, LC104, LC226动态规划⭐⭐⭐⭐⭐LC70, LC198, LC322二分搜索⭐⭐⭐⭐⭐LC704, LC33, LC34回溯/递归⭐⭐⭐⭐LC46, LC78, LC200滑动窗口⭐⭐⭐⭐LC3, LC76, LC209堆/优先队列⭐⭐⭐⭐LC215, LC347, LC23图论(BFS/DFS)⭐⭐⭐⭐LC200, LC207, LC133字符串/KMP⭐⭐⭐LC28, LC5, LC214并查集⭐⭐⭐LC547, LC684Trie树⭐⭐⭐LC208, LC212线段树/树状数组⭐⭐LC307, LC315位运算⭐⭐LC136, LC191贪心⭐⭐LC435, LC56 14周学习路线建议周次内容重点第1-2周数组、链表、栈、队列基础数据结构建立编码手感第3-4周递归、树、堆、排序递归思维 基础算法第5-6周二分、哈希、双指针、滑动窗口高频技巧面试必考第7-8周BFS/DFS、图论图算法拓扑排序第9-10周动态规划最难但最重要背包股票系列第11-12周贪心、位运算、并查集、Trie进阶专题第13-14周线段树、设计题、综合刷题冲刺阶段刷题黄金法则每道题至少做3遍——第1遍理解思路第2遍独立写出第3遍限时完成15-20分钟