一、前置准备(1 周)
1. 编程语言选择
- Python:语法简洁,适合快速实现算法(推荐)
- Java:面向对象,适合理解数据结构的封装
- C++:性能高,适合算法竞赛(如 ACM)
2. 必备数学基础
- 高中数学:函数、概率、排列组合
- 离散数学:基本逻辑、图论基础(可选)
二、基础数据结构(2-4 周)
1. 线性结构
-
数组(Array)
- 基础操作:增删改查、排序(冒泡 / 选择 / 插入)
- 应用:前缀和、滑动窗口
- 练习:LeetCode#1(两数之和)、#26(删除有序数组中的重复项)
-
链表(Linked List)
- 单链表、双链表、循环链表
- 操作:反转、快慢指针、合并
- 练习:LeetCode#206(反转链表)、#141(环形链表)
-
栈(Stack)与队列(Queue)
- 后进先出(LIFO)vs 先进先出(FIFO)
- 应用:括号匹配、表达式求值、BFS
- 练习:LeetCode#20(有效的括号)、#232(用栈实现队列)
2. 非线性结构
-
哈希表(Hash Table)
- 原理:哈希函数、冲突解决(开放寻址法、链地址法)
- 应用:缓存、去重
- 练习:LeetCode#1(两数之和)、#49(字母异位词分组)
-
树(Tree)
- 二叉树:遍历(前 / 中 / 后序、层序)
- 二叉搜索树(BST):插入、删除、查找
- 练习:LeetCode#94(二叉树的中序遍历)、#226(翻转二叉树)
三、算法思想(3-6 周)
1. 基础算法
-
排序算法
- 时间复杂度对比:O (n²) vs O (nlogn)
- 实现:快速排序、归并排序、堆排序
- 练习:LeetCode#912(排序数组)
-
搜索算法
- 二分查找:模板与变体
- BFS/DFS:树与图的遍历
- 练习:LeetCode#704(二分查找)、#200(岛屿数量)
2. 进阶算法思想
-
贪心算法
- 适用场景:局部最优解→全局最优
- 例题:LeetCode#455(分发饼干)、#55(跳跃游戏)
-
动态规划(DP)
- 解题步骤:定义状态、状态转移方程、初始化
- 经典问题:斐波那契数列、背包问题、最长公共子序列
- 练习:LeetCode#53(最大子数组和)、#70(爬楼梯)
-
递归与分治
- 递归模板:终止条件、递推关系
- 分治:归并排序、快速幂
- 练习:LeetCode#21(合并两个有序链表)、#50(Pow (x, n))
四、进阶数据结构(3-4 周)
1. 高级树结构
-
堆(Heap)
- 最大堆 / 最小堆:插入、删除、堆排序
- 应用:TopK 问题、优先队列
- 练习:LeetCode#215(数组中的第 K 个最大元素)
-
并查集(Union-Find)
- 路径压缩优化
- 应用:连通性问题
- 练习:LeetCode#547(省份数量)
2. 图(Graph)
- 存储:邻接表、邻接矩阵
- 算法:Dijkstra、Floyd-Warshall、拓扑排序
- 练习:LeetCode#743(网络延迟时间)、#207(课程表)
五、实战与提升(持续)
1. 刷题策略
- 按专题刷:先分类练习(如链表、DP),再综合训练
- 推荐平台:LeetCode(中文)、Codeforces(竞赛)
- 刷题量:基础阶段 100-150 题,进阶阶段 200 + 题
2. 竞赛与面试准备
- 算法竞赛:参加 LeetCode 周赛、ACM 区域赛
- 面试准备:
- 高频题:二分查找、DFS/BFS、DP、链表操作
- 系统设计:结合数据结构(如 LRU 缓存、短网址服务)
3. 源码与工程实践
- 阅读开源代码:如 Java 集合框架(ArrayList、HashMap)的实现
- 项目应用:在实际项目中使用算法优化性能(如缓存淘汰策略)
六、推荐学习资源
1. 书籍
- 入门:《大话数据结构》《算法图解》
- 进阶:《算法导论》(第 3 版)、《数据结构与算法分析》
- 面试:《剑指 Offer》《程序员代码面试指南》
2. 在线课程
- 免费:Coursera《Algorithms, Part I & II》(Princeton University)
- 付费:极客时间《数据结构与算法之美》、LeetCode Premium
3. 工具与网站
- 可视化工具:VisuAlgo(数据结构可视化)
- 代码托管:GitHub(搜索算法题解仓库)