
合理运用心流通道,科学刷题,快乐刷题!
怎么刷算法题?按照什么顺序刷题?如何科学地提高算法能力?
如果你刚开始刷题,还不熟悉基本编程语法和常用库函数,推荐先刷力扣官方的入门题单:
有了一些简单题的积累,就可以开始刷我的题单啦~

下文提到的「难度分」写在我的题单中,题目右侧的数字即为难度分。
| 刷题顺序 | 题单 | 必做内容 | 备注 |
|---|---|---|---|
| 编程入门 | 有两道数据库的题,可以跳过 | ||
| 滑动窗口 | 定长滑动窗口、不定长滑动窗口 | 完成难度分 的题目,下同 | |
| 二分算法 | 二分查找 | 二分答案选做,觉得困难可以直接跳过 | |
| 数据结构 | 常用枚举技巧、前缀和、栈、队列、堆 | 「新手村常用工具」 | |
| 链表、树、回溯 | 二叉树 DFS | 理解递归,为动态规划做铺垫 | |
| 网格图 | 网格图 DFS | 进一步理解递归 | |
| 链表、树、回溯 | 回溯 | 进一步理解递归 | |
| 动态规划 | 前六章 | 见下 |
关于动态规划的备注:动态规划是新人的一道坎,唯有坚持多练,至少要做 道才算入门。考虑到动态规划题单难度分 的题目并不多,可以扩大到难度分 的题目。
完成上表后,恭喜你通关新手村,正式踏入算法的广阔世界!见后面的完整题单,刷题顺序随意。
请结合 基础算法精讲 学习。
推荐安装插件 LeetCodeRating|显示力扣周赛难度分,可以在题单中自动标记做过的题目。(注意:需要在扩展程序的管理页面,开启开发者模式/开发人员模式。)
按照题单刷题可以让你快速渡过萌新阶段。然而,你会提前知道题目类型,跳过了一些思考步骤。但比赛/笔试是不会告诉你这题是什么类型的,把动态规划想成贪心的大有人在。
渡过萌新阶段后,可以偶尔随机刷题,锻炼自己判断题目类型的能力。
问:这个刷题方法的优缺点是什么?
答:优点是,做题时不知道题目类型,可以增强实战能力;查漏补缺,检验自己的学习成果。缺点是,知识点零散,不如题单那么系统。综合来说,可以每隔一段时间随机刷题,检验自己的学习成果。

如果即将面试,时间紧迫,可以刷 HOT 100,这些都是经典面试题。
另外还有一个 面试 150 题单,其实它和 HOT 100 有很多重复题目,如果刷完 HOT 100 还有时间的话,可以刷这个 150 题单。
问:初次接触一个专题时,我应该如何学习?
答:可以把专题中的第一道题当作例题,学习题解中的理论讲解。其余题目当作配套练习。
问:做题没思路,思考多久可以看题解?
答:十分钟到数小时都可以。如果看完题解觉得题解很妙,那就学到了一个自己不会的技巧。如果看完题解觉得自己是xx,可以再多思考下,或者换个时间段(早/中/晚/洗澡的时候)思考,说不定就有思路了。(注:这在心理学上叫做孵化效应,即在离开问题后,大脑会在无意识中处理问题,从而在重返问题时突然产生新的思路。)
问:很多题目没有思路,感到焦虑怎么办?
答:学算法是需要时间沉淀的,坚持刷题吧。现在不会的算法/题目,过段时间再来看,会有新的感悟。对于初次刷题的同学,推荐先完成难度分低于 的题目,跳过暂时无法理解的题目。
问:如何根据数据范围,估计题目允许的时间复杂度,从而估计要用什么算法?
答:一般每秒能执行约 次运算(Python 可能要除以 ),可以据此估计能通过的时间复杂度,如下表所示。
| 数据范围 | 允许的时间复杂度 | 适用算法举例 |
|---|---|---|
| 或 | 回溯、暴力搜索 | |
| 状态压缩 DP | ||
| 折半枚举 | ||
| 三重循环的 DP、Floyd | ||
| 二重循环的 DP、背包 | ||
| 大多数题目都是这个范围,所以各类算法都有 | ||
| 线性 DP、滑动窗口 | ||
| 判断质数 | ||
| 或 | 二分、快速幂、数学公式 |
注:实际做题时,注意常数因子的影响。例如哈希表比数组慢。
如果您还有其他疑问或建议,欢迎在下方评论。