想要在业余时间高效地刷 LeetCode,找对学习资源和方法至关重要。它就像是给你的编程能力装上了一个加速器。我个人觉得,最好的方法是 “理论 + 实操 + 总结” 的结合。下面我来给你详细说说,怎么把这些元素完美地搭配起来。
核心理念:理解原理,熟能生巧,举一反三
刷 LeetCode 的目的不仅仅是“做对题”,更重要的是通过题目掌握和巩固相关的算法和数据结构知识。所以,光是复制代码、提交答案是远远不够的。
1. 打好基础:理论知识是基石
在开始刷题之前,或者在遇到某个知识点不熟悉的时候,扎实的理论基础是效率的保证。你可以根据自己的情况选择以下几种方式:
书籍类(深入理解):
《算法图解》(Anatomy of Algorithms): 这本书最大的优点是 可视化。它用大量的图示来解释各种算法(如排序、图搜索、动态规划等)的工作原理,非常直观,适合初学者快速理解概念。这本书能帮你建立起对算法的基本感知。
《算法(第4版)》(Algorithms, 4th Edition by Robert Sedgewick and Kevin Wayne): 这本书是经典中的经典。它系统地讲解了数据结构和算法,从基础的数组、链表、栈、队列,到复杂的图、字符串、动态规划等,都有深入的剖析。虽然内容比较厚重,但如果你想 深入理解算法背后的数学原理和实现细节,这本书是绝佳的选择。不过,可以不必一开始就啃完,可以作为工具书,在遇到特定算法时去查阅。
《剑指Offer》(何海涛): 这本书更侧重于 面试题。里面的题目很多都来自于真实的面试,包含大量的 LeetCode 上的经典题目。它会给出多种解法,并解释思路,非常适合想要通过 LeetCode 提高面试能力的同学。
怎么用?
初学者: 先看《算法图解》建立直观认识。
进阶者/想深入理解: 《算法(第4版)》是你的“宝典”,可以按章节阅读,或者在你刷 LeetCode 遇到某个专题时,去对应章节深入学习。
备战面试: 《剑指Offer》是必不可少的,它更贴合 LeetCode 的实战需求。
视频课程/网站(系统学习):
B站(哔哩哔哩): 这是我的强烈推荐!B站上有海量的优质编程教学视频,涵盖了数据结构和算法的方方面面。
搜索关键词: “数据结构与算法”、“LeetCode 讲解”、“动态规划”、“图论”、“排序算法” 等。
推荐up主(举例,具体可以根据喜好选择):
拉勾教育(虽然是付费课程,但很多精华片段会被分享)
程序员李三思
小林coding(他的图解系列深入人心)
各种大学的公开课(比如北京大学、清华大学的算法课程)
优势: 讲解生动,有可视化演示,可以跟着老师一起思考,学习氛围浓厚。你可以找到 针对特定 LeetCode 题目的讲解视频,这比自己闷头想效率高太多了。
Coursera/edX/Udemy: 如果你想系统地学习计算机科学的基础知识,这些平台上有世界顶尖大学的课程,例如:
Coursera:斯坦福大学的《Algorithms》
Udemy:有大量关于数据结构与算法的入门和进阶课程
优势: 课程体系完整,教学质量有保证。
LeetCode 官方资源: LeetCode 网站本身也有一些视频讲解,或者推荐的学习路径。
怎么用?
系统学习: 找一套完整的、评价好的数据结构与算法视频课程,按照课程的节奏学习。
解决难题: 遇到 LeetCode 上的难题,别卡太久,去 B站搜索该题目的解法视频,学习别人的思路。
回顾: 学习完一个章节的理论知识后,去找相关的 LeetCode 题目来练习,再看视频回顾,加深理解。
2. 高效刷题:实战演练是关键
理论学习得再好,也需要通过大量的练习来巩固。这里的“高效”指的是:
有策略地刷: 不要漫无目的地刷,而是有计划、有主题地进行。
注重思路,而非复制代码: 遇到不会的题,先尝试自己思考,实在不行再看题解,看完后要理解为什么,然后自己重写一遍。
总结归纳: 这是提升效率最重要的一步。
LeetCode 网站自身:
按标签/主题刷: LeetCode 页面左侧有很多“标签”或“主题”,比如“数组”、“链表”、“二叉树”、“动态规划”、“滑动窗口”、“双指针”等等。强烈建议按照这些主题去刷题。 这样你在短时间内会接触到大量相似的问题,能够快速掌握某种技巧或模型。
新手推荐顺序: 数组 > 链表 > 字符串 > 栈/队列 > 树(二叉树、BST)> 图(BFS/DFS)> 排序 > 查找 > 动态规划 > 位运算 > 回溯。
探索卡片(Explore Cards): LeetCode 提供了很多“探索卡片”,比如“初识 LeetCode”、“数据结构”、“算法”等,里面会精选一些题目,并给出详细的讲解,非常适合入门。
周赛/双周赛: 如果你的基础还可以,可以尝试参加 LeetCode 的周赛。它能模拟真实的比赛压力,让你在规定时间内解决问题,也是检验学习成果的好方法。
题解区(Solutions/Discuss): 这是 LeetCode 的宝藏!当你做完一道题(无论是否AC),都要去题解区看看,别人的解法往往更巧妙、更高效。
优先看: 官方题解、点赞最高的题解、提供清晰思路(特别是图解)的题解。
学习: 学习不同的解法(递归、迭代、分治、动态规划、贪心等),学习优化思路(时间复杂度、空间复杂度)。
怎么用?
规划: 每天或每周给自己设定一个刷题目标,比如“今天刷 5 道关于链表的题”,或者“本周刷完二叉树的 Easy 和 Medium 题”。
思考: 拿到一道题,先读懂题意,然后花 1530 分钟尝试自己思考。可以画图、列出例子、思考边界条件。
看题解: 如果实在想不出来,或者有思路但觉得效率不高,就去看题解。重点在于理解思路,然后尝试自己动手写一遍,而不是直接复制粘贴。
提交与分析: 提交代码,看是否通过。如果没通过, debug;如果通过了,再去题解区看看是否有更好的方法。
辅助网站/工具:
GitHub 上的 LeetCode 题解仓库: 很多大神会整理 LeetCode 的题解,并且提供多种语言的实现。搜索“LeetCode Solutions”就能找到很多。
VisuAlgo.net: 这个网站提供了各种算法和数据结构的可视化演示,在你理解一个算法(如图的遍历、堆排序)时,配合 VisuAlgo 的动画,会帮助你理解得更透彻。
怎么用?
对照学习: 在 LeetCode 刷题过程中,遇到某个算法不太熟悉,可以去 GitHub 找现成的、解释清晰的题解来对照。
可视化辅助: 在学习一个新算法时,用 VisuAlgo.net 看看它的动态演示,会很有帮助。
3. 深度总结:形成自己的知识体系
这应该是提升效率最关键但最容易被忽略的一步。
个人笔记/博客:
记录思路: 对于遇到的经典题目、自己容易出错的题目、或者学到的新技巧,都要记录下来。记录不只是题目本身,更重要的是 你当时的思考过程、遇到的困难、以及最终的解题思路。
归纳模式: 比如,你发现很多“子数组求和”的问题可以用“前缀和”来解决;很多“求路径”的问题可以用“DFS”或“BFS”;很多“优化选择”的问题可以用“动态规划”或“贪心”。把这些模式总结出来。
整理专题: 建立一个关于“数据结构”和“算法”的知识体系,比如:
数据结构: 数组、链表、栈、队列、哈希表、树(二叉树、BST、AVL、红黑树)、堆、图、Trie。
算法: 排序(冒泡、选择、插入、快排、归并、堆排)、查找(二分查找)、搜索(DFS, BFS)、动态规划、贪心、回溯、分治、位运算。
定期复习: 你的笔记就是你自己的“宝典”,定期回顾,加深记忆,并且能让你在遇到类似问题时,能快速回忆起解决思路。
怎么用?
工具选择: 可以用 Markdown 文件(如 Typora, Obsidian)、 Notion、或者一个简单的博客来记录。
记录格式:
题目名称 & 链接
题目类型/涉及算法
自己的思考过程/遇到的坑
最优解法思路(用自己的话复述)
核心代码片段(或关键优化点)
类比题目/相关技巧
形成“套路”: 比如,当你看到“找到第 k 大/小元素”时,你会想到堆或者快排的 partition。看到“求最短路径”时,你会想到 BFS。看到“最长递增子序列”时,你会想到动态规划。
在 LeetCode 上的“收藏”功能:
LeetCode 提供了收藏功能,你可以把你觉得重要的题目、或者以后需要复习的题目收藏起来。
怎么用? 刷题时,遇到让你眼前一亮的题目,或者感觉以后可能还会遇到的,就收藏起来。定期去你的收藏列表里挑几道题重新做一遍。
3. 学习路径建议:
1. 入门阶段:
视频/课程: 找一套入门级的 数据结构与算法视频课程(B站或者 Coursera/Udemy),系统学习基础概念。
书籍: 《算法图解》作为辅助,帮助理解。
LeetCode: 从 LeetCode 的 “探索卡片” 开始,熟悉 LeetCode 的界面和做题流程。然后从 “Easy” 难度,按照 “标签”(数组、链表、字符串、栈/队列)来刷。
2. 进阶阶段:
视频/课程: 学习更进阶的算法,如动态规划、图论、回溯等。可以看 B站上针对特定算法主题的讲解视频。
书籍: 《剑指Offer》开始作为练习题库,同时《算法(第4版)》作为参考书。
LeetCode: 开始刷 “Medium” 难度,继续按照标签主题来。重点是 理解多种解法,并尝试自己实现。 多看题解,多总结!
比赛: 尝试参加 LeetCode 的周赛/双周赛。
3. 巩固与提升阶段:
LeetCode: 挑战 “Hard” 难度,或者回顾之前做过的 Medium 题,看能否有更优的解法。
复习: 定期复习你的笔记,重做收藏过的题目。
模拟面试: 如果是为面试做准备,可以找朋友一起互相出题,模拟面试场景。
一些小贴士:
坚持! 刷 LeetCode 是一个循序渐进的过程,不可能一蹴而就。每天进步一点点,积少成多。
不要怕犯错: 犯错是学习的必经之路。重要的是从错误中学习。
找到你的学习节奏: 有些人喜欢早晨刷题,有些人喜欢晚上。找到最适合你的时间段。
多与人交流: 如果遇到难题,可以和同学、朋友讨论,或者在 LeetCode 的讨论区提问。
劳逸结合: 业余时间也要注意休息,不要过度疲劳。
总而言之,高效刷 LeetCode 的核心在于 “理解” 和 “总结”。把理论知识转化为解决问题的能力,再把实践经验沉淀为自己的知识体系。祝你刷题顺利!