目标
在26周内完成约500-600道算法题目,覆盖LeetCode、HackerRank等平台的主要题型,掌握常见数据结构和算法,为算法面试或竞赛打下坚实基础。首周专注于二叉树,后续覆盖链表、栈队列、数组字符串、动态规划、图、贪心等主题。
总体安排
-
每周时间:5-6天刷题,每天1-2小时(2-4题),每周15-20题。
-
每周结构:
- 周一至周五/六:学习新知识 + 刷题(3-4题/天)。
- 周日:复习错题、总结模板、预习下周主题(1-2小时)。
-
工具:LeetCode(主)、HackerRank、NeetCode、笔记本(记录错题和模板)。
-
语言:推荐Python(简洁,适合快速实现)或C++(熟悉指针和性能优化)。
-
资源:
- LeetCode Explore(leetcode.com/explore/)。
- NeetCode Roadmap(neetcode.io/roadmap)。
- 《算法4》或《Introduction to Algorithms》。
- X平台算法讨论(如#LeetCode标签)。
每周详细计划
第1周:二叉树(Binary Tree)
目标:掌握二叉树基础、遍历、路径问题、BST,为后续复杂树结构打基础。
学习:节点、遍历(前序/中序/后序/层序)、递归、迭代、BFS、DFS、BST性质。
题目(18题):
- 周一:LeetCode #94, #144, #145(遍历,简单)。
- 周二:LeetCode #102, #101, #104(层序、对称、深度,简单/中等)。
- 周三:LeetCode #112, #113, #257(路径问题,简单/中等)。
- 周四:LeetCode #105, #106, #236(构造树、LCA,中等)。
- 周五:LeetCode #98, #700, #701(BST,简单/中等)。
- 周六:LeetCode #124, #199(最大路径、右视图,中等/困难)。
- 周日:复习错题,总结遍历模板(递归/迭代/BFS),预习链表。
作业:整理遍历和BST代码模板,记录#124的递归解法。
第2周:链表(Linked List)
目标:掌握单链表、双链表操作,快慢指针、反转、环检测。
学习:链表结构、指针操作、快慢指针、递归与迭代解法。
题目(18题):
- 周一:LeetCode #206, #21(反转、合并,简单)。
- 周二:LeetCode #141, #142(环检测,中等)。
- 周三:LeetCode #19, #83(删除倒数第N个节点、去重,简单/中等)。
- 周四:LeetCode #146, #160(LRU Cache、相交链表,中等)。
- 周五:LeetCode #234, #328(回文链表、奇偶链表,中等)。
- 周六:LeetCode #25, #92(K组反转、部分反转,中等/困难)。
- 周日:复习错题,总结快慢指针模板,预习栈队列。
作业:手写反转链表的递归与迭代代码,分析#146的时间复杂度。
第3周:栈与队列(Stack & Queue)
目标:掌握栈的LIFO、队列的FIFO,单调栈/队列应用。
学习:栈/队列实现、单调栈、优先队列基础。
题目(16题):
- 周一:LeetCode #20, #155(括号匹配、最小栈,简单/中等)。
- 周二:LeetCode #232, #225(队列用栈实现、栈用队列实现,简单)。
- 周三:LeetCode #739, #496(每日温度、下一个更大元素,中等)。
- 周四:LeetCode #622, #641(循环队列、双端队列,中等)。
- 周五:LeetCode #150, #394(逆波兰表达式、字符串解码,中等)。
- 周六:LeetCode #84(柱状图最大矩形,困难)。
- 周日:复习错题,总结单调栈模板,预习数组字符串。
作业:整理单调栈的代码模板,分析#84的单调栈解法。
第4周:数组与字符串(Array & String)
目标:掌握数组操作、双指针、滑动窗口、字符串匹配。
学习:双指针、滑动窗口、KMP算法、前缀和。
题目(18题):
- 周一:LeetCode #1, #15(两数之和、三数之和,简单/中等)。
- 周二:LeetCode #344, #541(反转字符串、反转字符串II,简单)。
- 周三:LeetCode #3, #76(最长无重复子串、最小覆盖子串,中等/困难)。
- 周四:LeetCode #5, #647(最长回文子串、回文子串计数,中等)。
- 周五:LeetCode #28, #459(KMP、重复子字符串,简单/中等)。
- 周六:LeetCode #438, #424(字母异位词、最长替换后同字母子串,中等)。
- 周日:复习错题,总结滑动窗口模板,预习动态规划。
作业:整理双指针和滑动窗口模板,手写KMP算法。
第5周:动态规划(Dynamic Programming I)
目标:掌握DP基础,理解状态转移和记忆化。
学习:DP定义、状态设计、递推公式、记忆化递归。
题目(16题):
- 周一:LeetCode #70, #746(爬楼梯、最小花费爬楼梯,简单)。
- 周二:LeetCode #198, #213(打家劫舍I/II,中等)。
- 周三:LeetCode #300, #1143(最长递增子序列、最长公共子序列,中等)。
- 周四:LeetCode #416, #494(分割等和子集、目标和,中等)。
- 周五:LeetCode #62, #63(不同路径I/II,中等)。
- 周六:LeetCode #322(零钱兑换,中等)。
- 周日:复习错题,总结DP状态转移模板,预习DP进阶。
作业:整理#300的O(n log n)解法,分析DP空间优化技巧。
第6周:动态规划(Dynamic Programming II)
目标:深入DP,掌握背包问题、区间DP、状态压缩DP。
学习:0/1背包、完全背包、区间DP、状态压缩。
题目(16题):
- 周一:LeetCode #518, #377(零钱兑换II、组合总和IV,中等)。
- 周二:LeetCode #139, #140(单词拆分I/II,中等/困难)。
- 周三:LeetCode #91, #639(解码方法I/II,中等/困难)。
- 周四:LeetCode #96, #95(不同二叉搜索树I/II,中等)。
- 周五:LeetCode #312, #877(戳气球、石子游戏,困难/中等)。
- 周六:LeetCode #416(复习,分割等和子集,中等)。
- 周日:复习错题,总结背包DP模板,预习图算法。
作业:整理0/1背包模板,分析#312的区间DP思路。
第7周:图算法(Graph I)
目标:掌握图的基础表示、DFS、BFS、拓扑排序。
学习:邻接表/矩阵、DFS、BFS、拓扑排序。
题目(16题):
- 周一:LeetCode #200, #733(岛屿数量、图像渲染,简单/中等)。
- 周二:LeetCode #207, #210(课程表I/II,中等)。
- 周三:LeetCode #547, #684(朋友圈、冗余连接,中等)。
- 周四:LeetCode #130, #417(被围绕区域、太平洋大西洋水流,中等)。
- 周五:LeetCode #323, #785(连通分量数量、判断二分图,中等)。
- 周六:LeetCode #994(腐烂的橘子,中等)。
- 周日:复习错题,总结DFS/BFS模板,预习图进阶。
作业:整理DFS和BFS的代码模板,手写拓扑排序。
第8周:图算法(Graph II)
目标:掌握最短路径、并查集、最小生成树。
学习:Dijkstra、Floyd、Union-Find、Kruskal/Prim。
题目(16题):
- 周一:LeetCode #743, #787(网络延迟时间、最便宜航班,中等)。
- 周二:LeetCode #1584, #1135(连接所有点的最小费用,Kruskal,中等)。
- 周三:LeetCode #721, #952(账户合并、按公因数计算最大组件,中等)。
- 周四:LeetCode #1971, #2092(寻找图中是否存在路径、找出知晓秘密的人,中等)。
- 周五:LeetCode #399(除法求值,中等)。
- 周六:LeetCode #815(公交路线,困难)。
- 周日:复习错题,总结Union-Find模板,预习贪心算法。
作业:整理Dijkstra和Union-Find模板,分析#815的BFS解法。
第9周:贪心算法(Greedy)
目标:掌握贪心算法的适用场景和证明方法。
学习:贪心选择性质、区间问题、活动选择。
题目(16题):
- 周一:LeetCode #55, #45(跳跃游戏I/II,中等)。
- 周二:LeetCode #435, #452(无重叠区间、用最少箭射气球,中等)。
- 周三:LeetCode #121, #122(买卖股票I/II,简单/中等)。
- 周四:LeetCode #605, #763(种花问题、划分字母区间,中等)。
- 周五:LeetCode #406, #646(根据身高重建队列、最长数对链,中等)。
- 周六:LeetCode #135(分发糖果,困难)。
- 周日:复习错题,总结贪心选择模板,预习堆。
作业:整理区间问题贪心模板,分析#135的贪心思路。
第10周:堆与优先队列(Heap & Priority Queue)
目标:掌握堆操作、Top K问题、滑动窗口最大值。
学习:堆排序、优先队列实现、堆的应用。
题目(16题):
- 周一:LeetCode #215, #347(数组第K大、Top K频繁元素,中等)。
- 周二:LeetCode #295, #703(数据流中位数、Kth大元素,中等)。
- 周三:LeetCode #239, #480(滑动窗口最大值、中位数,困难)。
- 周四:LeetCode #378, #373(矩阵第K小、K对最小和,中等)。
- 周五:LeetCode #692, #767(Top K频繁单词、重组字符串,中等)。
- 周六:LeetCode #502(IPO,困难)。
- 周日:复习错题,总结堆模板,预习回溯。
作业:整理堆操作模板,手写优先队列实现。
第11周:回溯与递归(Backtracking & Recursion)
目标:掌握回溯算法,解决排列组合、子集问题。
学习:回溯框架、剪枝、递归深度。
题目(16题):
- 周一:LeetCode #46, #47(全排列I/II,中等)。
- 周二:LeetCode #78, #90(子集I/II,中等)。
- 周三:LeetCode #17, #39(电话号码组合、组合总和,中等)。
- 周四:LeetCode #40, #216(组合总和II/III,中等)。
- 周五:LeetCode #51, #52(N皇后I/II,困难)。
- 周六:LeetCode #79(单词搜索,中等)。
- 周日:复习错题,总结回溯模板,预习滑动窗口。
作业:整理回溯框架代码,手写#51的N皇后解法。
第12周:滑动窗口与双指针(Sliding Window & Two Pointers)
目标:掌握滑动窗口和双指针技巧,解决字符串和数组问题。
学习:快慢指针、左右指针、窗口维护。
题目(16题):
- 周一:LeetCode #3, #76(最长无重复子串、最小覆盖子串,中等/困难)。
- 周二:LeetCode #424, #438(最长替换后同字母子串、字母异位词,中等)。
- 周三:LeetCode #11, #42(盛水最多的容器、接雨水,中等/困难)。
- 周四:LeetCode #209, #904(最小子数组、果篮,中等)。
- 周五:LeetCode #567, #1004(字符串排列、最长连续1,中等)。
- 周六:LeetCode #995(K连续位的最小翻转次数,困难)。
- 周日:复习错题,总结滑动窗口模板,预习高级数据结构。
作业:整理滑动窗口模板,分析#42的单调栈解法。
第13周:高级数据结构(Advanced Data Structures I)
目标:掌握Trie、并查集的基础应用。
学习:Trie结构、并查集优化、路径压缩。
题目(16题):
- 周一:LeetCode #208, #212(实现Trie、单词搜索II,中等/困难)。
- 周二:LeetCode #720, #676(最长单词、实现魔法字典,中等)。
- 周三:LeetCode #547, #684(朋友圈、冗余连接,中等,复习)。
- 周四:LeetCode #721, #952(账户合并、按公因数计算最大组件,中等)。
- 周五:LeetCode #200, #130(岛屿数量、被围绕区域,中等,复习)。
- 周六:LeetCode #803(打砖块,困难)。
- 周日:复习错题,总结Trie和并查集模板,预习高级数据结构II。
作业:整理Trie插入/搜索模板,手写并查集路径压缩。
第14周:高级数据结构(Advanced Data Structures II)
目标:掌握线段树、平衡树、单调队列。
学习:线段树构建/查询、单调队列优化。
题目(16题):
- 周一:LeetCode #307, #315(区域和检索、逆序对,中等/困难)。
- 周二:LeetCode #327, #493(区间和的个数、翻转对,困难)。
- 周三:LeetCode #239, #862(滑动窗口最大值、最短子数组和,困难,复习)。
- 周四:LeetCode #732, #715(我的日程安排表I、区域管理,困难)。
- 周五:LeetCode #218(天际线问题,困难)。
- 周六:LeetCode #850(矩形面积II,困难)。
- 周日:复习错题,总结线段树模板,预习复习周。
作业:整理线段树构建/更新模板,分析#218的扫描线算法。
第15周:复习与综合练习
目标:巩固前14周内容,重点复习错题和薄弱主题。
学习:复习二叉树、链表、DP、图、堆等高频模板。
题目(15题):
- 周一:LeetCode #94, #206, #20(遍历、反转链表、括号,简单,复习)。
- 周二:LeetCode #3, #15, #76(两数/三数之和、最小覆盖,中等/困难,复习)。
- 周三:LeetCode #300, #416(LIS、分割等和子集,中等,复习)。
- 周四:LeetCode #200, #207(岛屿数量、课程表,中等,复习)。
- 周五:LeetCode #215, #347(Top K问题,中等,复习)。
- 周六:LeetCode #124, #239(最大路径和、滑动窗口最大值,困难,复习)。
- 周日:重做错题,总结高频模板,预习数学相关。
作业:整理前14周错题,更新代码模板库。
第16周:数学与位运算(Math & Bit Manipulation)
目标:掌握数学和位运算相关算法。
学习:质数、GCD、快速幂、位运算技巧。
题目(16题):
- 周一:LeetCode #204, #263(计数质数、丑数,简单/中等)。
- 周二:LeetCode #231, #338(2的幂、比特位计数,简单/中等)。
- 周三:LeetCode #136, #137(只出现一次的数字I/II,中等)。
- 周四:LeetCode #191, #461(位1的个数、汉明距离,简单)。
- 周五:LeetCode #50, #372(Pow(x,n)、超级次方,中等)。
- 周六:LeetCode #318(最大单词长度乘积,中等)。
- 周日:复习错题,总结位运算模板,预习设计问题。
作业:整理快速幂和位运算模板,手写#338的DP解法。
第17周:设计问题(Design)
目标:掌握常见数据结构设计,如LRU、LFU、前缀树。
学习:哈希表+链表、优先队列+哈希表、Trie设计。
题目(16题):
- 周一:LeetCode #146, #460(LRU Cache、LFU Cache,中等/困难)。
- 周二:LeetCode #208, #211(实现Trie、添加与搜索单词,中等)。
- 周三:LeetCode #295, #703(数据流中位数、Kth大元素,中等,复习)。
- 周四:LeetCode #355(设计Twitter,中等)。
- 周五:LeetCode #380, #381(O(1)插入删除随机,中等)。
- 周六:LeetCode #432(全O(1)的数据结构,困难)。
- 周日:复习错题,总结LRU模板,预习模拟问题。
作业:整理LRU和Trie设计模板,分析#432的实现。
第18周:模拟与实现(Simulation & Implementation)
目标:掌握模拟类问题,注重代码实现细节。
学习:字符串处理、矩阵操作、模拟规则。
题目(16题):
- 周一:LeetCode #12, #13(整数转罗马、罗马转整数,简单/中等)。
- 周二:LeetCode #54, #59(螺旋矩阵I/II,中等)。
- 周三:LeetCode #48, #73(旋转矩阵、矩阵置零,中等)。
- 周四:LeetCode #289, #498(生命游戏、对角线遍历,中等)。
- 周五:LeetCode #394, #682(字符串解码、棒球游戏,中等)。
- 周六:LeetCode #227(基本计算器II,中等)。
- 周日:复习错题,总结矩阵操作模板,预习综合练习。
作业:整理螺旋矩阵模板,手写#227的栈实现。
第19周:综合练习与模拟面试
目标:模拟面试环境,混合练习高频题。
学习:复习高频模板,练习时间管理。
题目(15题):
- 周一:LeetCode #1, #15, #206(两数/三数之和、反转链表,简单/中等,复习)。
- 周二:LeetCode #94, #236(中序遍历、LCA,中等,复习)。
- 周三:LeetCode #3, #76(最长无重复子串、最小覆盖,困难,复习)。
- 周四:LeetCode #146, #295(LRU Cache、数据流中位数,中等,复习)。
- 周五:LeetCode #200, #207(岛屿数量、课程表,中等,复习)。
- 周六:LeetCode #124, #239(最大路径和、滑动窗口最大值,困难,复习)。
- 周日:参加LeetCode Contest或模拟面试,总结错题。
作业:记录模拟面试中的时间分配问题,优化解题速度。
第20-26周:专项强化与综合复习
目标:针对薄弱环节强化练习,参加模拟比赛,巩固所有知识点。
每周安排:
-
主题:每周挑选1-2个薄弱主题(如DP、图、堆),或混合练习高频题。
-
题目(15-20题/周):
- 从LeetCode高频题、NeetCode 150、公司标签题(如Google、Amazon)中选择。
- 例题:LeetCode #10(正则表达式,困难)、#23(合并K个链表,困难)、#146(LRU Cache,复习)。
-
模拟比赛:每周参加1次LeetCode Weekly/Biweekly Contest,练习限时解题。
-
复习:每周重做5-10道错题,重点优化代码和时间复杂度。
-
总结:整理所有主题的代码模板,更新错题库。
具体安排(示例):
- 第20周:DP+图(LeetCode #72, #743, #787)。
- 第21周:堆+回溯(LeetCode #23, #46, #51)。
- 第22周:滑动窗口+高级数据结构(LeetCode #76, #307, #315)。
- 第23周:综合练习(LeetCode #25, #124, #295)。
- 第24周:模拟比赛+错题复习。
- 第25周:公司高频题(Google、Amazon标签题)。
- 第26周:全面复习+模拟面试,整理模板库。
执行建议
- 时间管理:每天固定1-2小时,早上或晚上效率高,比赛安排在周末。
- 错题管理:用Notion/Excel记录错题(题号、错误原因、解法),每周回顾。
- 代码模板:每2周整理一次通用模板(如DFS、BFS、DP、滑动窗口)。
- 模拟面试:每月参加1-2次LeetCode Contest,记录解题时间和错误。
- 进度跟踪:每周统计AC题目数(目标15-20题),AC率达80%以上。
注意事项
- 灵活调整:若某主题较弱,可延长1周;若熟练,可提前进入下一主题。
- 心态管理:困难题(如#124、#239)先看题解,独立复现,逐步提升信心。
- 社区资源:关注LeetCode Discuss、X上的#LeetCode讨论,获取解题思路。
- 健康平衡:每周留1天休息,避免疲劳,保持长期动力。
最终目标
- 题目数量:完成500-600题,覆盖90%常见题型。
- 技能提升:熟练高频算法,掌握模板,应对算法面试/竞赛。
- 成果:整理完整的代码模板库,错题库,模拟面试通过率达80%以上。