说一个工科转CS同学的例子,毕业后刷题3个月拿到Facebook,Google,Amazon全职offer。
这是他在3个月刷题过程中做的笔记,将近900页,你们感受下
mnmunknown.gitbooks.io/algorithm-n…
大家刷LC的目的一般很明确,就是为了找工作应付算法面试。
由于选拔性质的存在,面试中的算法题从问题的深度和广度上都会有其限制:不能太难,也不能太偏。
所以算法面试往往并不完全是看谁最聪明,而是看谁准备最充分。这是一个可以靠针对性训练与总结“hack”的机制。
回到刷题本身,不要寄太大希望于“速成”。一般要制定一个至少几个月的学习计划,根据自己当前的基础和水平做针对性训练。
算法题数量太多怎么办?
前面说的同学在刷题的时候,LC大概只有400-500道题,不到现在的1/3。想要全部刷完LC上的题目其实不太现实也没必要。
我见过刷题不到100道就能进谷歌的人,也见过刷了500题依旧过不了面试的人。所以不要把“题目数量”作为刷题指标。而应该把问题拆解,拆成具体的问题模式和对应的解决方法。大概像是这样:

每道算法题都有其构成的基本单位,比如属于数组、用到了某某算法等。通过将问题拆分,做类比分析思考,自行做“聚类操作”,我们就能构建自己的算法知识体系。这个过程做笔记是最有效的。
比如很多问题都可以转化成“Tree”或者“Graph”,或者“递归”
搜索问题基本是多叉树,有些问题就是以root为起点的“走迷宫”——DFS + Backtracking
有些在搜索/子问题树里,要按特定顺序进行处理——在二叉树里,我们叫它pre-order / in-order / post-order遍历
有些时候,树的结构与子问题重复性很高——于是有了记忆化搜索 / 动态规划
知其所以然,寻找知识的根节点
一个问题求解的思考过程,要比最终解法更重要。就好比数学/物理定理,你理解了会用是一种境界,能完整证明又是另一种境界。所以如果可能的话,尽量不要让自己陷入靠记忆解决问题的地步。
就拿动态规划来说,我们刚做动态规划题的时候往往都摸不着头脑,看了答案之后恍然大悟,原来是这样,只要找到状态转移方程,之后就简单了。
但这里的坑点也在这里,因为答案一般直接告诉你了状态转移方程,却不会说明是如何找到状态转移方程的。这个思考过程在刷题中其实是欠缺的,这也导致看起来懂了,其实并没懂,下次遇到动规题还是很大可能不会。
如何提高刷题熟练度和速度?
- 直接在Online Judge上写,尽量靠眼睛debug,少用IDE;
- 常用算法/模板结构集中多练习(quick select,BFS/DFS);
- 多和朋友讨论,多做模拟面试;
- 面试前花1-2周时间好好练习白板代码
最后提供一些我觉得不错的算法入门书籍和工具
- Algorithms(红皮书,Princeton):适合入门,配合公开课一起看
- 算法导论:不建议入门时看,适合作参考书,带着问题来看
- VisuAlgo:算法可视化工具
- LintCode等Online Judge算法题训练平台
另外,九章算法班新一期首节直播分享也快开始了,有关国内外大厂算法面试的各种问题,包括如何高效刷题、如何跟面试官正确沟通、如何提升代码质量和bug free能力等,都会在直播中分享,欢迎大家来参加~