作者序
力扣(LeetCode),不同于信息学相关的竞赛,其题目虽然有一定难度,但出题角度并不会特别刁钻。通常,通过考查对力扣(LeetCode)题目的掌握程度可以大概估量一个人的算法能力,可以说练好力扣(LeetCode)算法题已经成为互联网大厂校招或社招技术面试必备的“敲门砖”。
1.如何入门
算法知识体系对于解题来说很重要,而体系的建立依赖于扎实的基础,因此了解数据结构和算法基础是入门的起点。
学习算法像拓扑排序,若没有任何的解题经验,普通人不可能独立创造一个算法来解决问题。积累经验是十分关键的,当我们积累的经验达到一定程度的时候,就可以从新问题中找到旧问题的影子,进一步联想过去所使用的解法,并加以转换,从而解决新的问题了。
几位作者大都已经完成了近千道题目,讨论发现,前一二百道题目大都是看着答案写的。刚开始接触力扣(LeetCode)时,我们会尝试独立解题,经常是一道题目想一天,这样的效率不够高,并会极大地影响刷题的心情。之后就会转换策略,以积累经验为目标去刷题,不强求自己想到解题方案,而更注重学习解题思路,理解算法思想。这样逐渐就学会了各种算法“套路”,在后面刷题的过程中也就更加得心应手了。
如何快速积累经验呢?首先是明确刷题策略,推荐每次集中火力攻克一种tag的题目,不断地重复对同类题型的理解和记忆,短期内快速提高对这类题型的解题能力。然后是题目选择,可以查阅别人整理好的力扣(LeetCode)题目清单,重点关注经典题型,跟随本书挑选的题目进行学习就是一个不错的策略。最后是解题方法,给每道题目限定一个思考时间,一般不超过半小时,想不到答案的话就看题解,从题解中理解算法的思想及主要流程。
这里给各位读者推荐几本算法学习的图书。
经典图书
● 入门书:《算法图解》《大话数据结构》。
● 面试准备:《剑指Offer》《编程之美》。
● 系统学习:《算法》(第4版)。
为了帮助读者更有效率地刷题,作者lucifer开发了一个Chrome 插件leetcode cheatsheet(插件地址见参考链接/文前[1]),插件提供了解题模板、题解及专题等辅助功能。
2.跨越瓶颈
有人问为什么刷了很多题,但遇到新的题目还是不会呢?
相信大部分人在刷题过程中都有迷失自我的时期,感觉“刷了很多题,但是看到新的题目还是不会”,甚至“看到了以前刷过的题目,还是不会”。这实际上和多种因素有关,我们总结了两个主要原因:基础不牢固和没有良好的刷题方法。
● 如果本身基础比较薄弱,那么刷再多的题目也是枉然,很容易事倍功半,这和高考前绝大多数人并不能通过题海战术真正提高成绩是一样的道理。当大家走上考场碰到新的问题时,如果没有真正掌握相关知识,即使之前刷了很多题,但还是很难现场解决新问题。这时应该多看书或视频学习并总结基础知识,而不是一味地刷题。
● 所谓“磨刀不误砍柴工”,掌握良好的刷题方法可以让你事半功倍。本书的内容可以作为很好的刷题参考,几位作者从自身经验出发总结出了这条算法通关之路,希望可以帮助读者成为解题高手。当然,除本书外,读者还可以通过各种渠道搜集、总结自己的刷题方法,学习的具体路径是因人而异的。
3.如何进阶
有了一定的基础之后,想进一步提高的话不在于做的题目有多少,而在于是否做得“精”。在做题时,研究题目的所有解法和解法背后的含义,举一反三,善于总结、思考才是必胜之道。
学习的过程不仅仅需要输入,有时输出也能够帮助你进行梳理总结,扫清知识盲点。输出可以有多种形式,比如做练习题、写题解、给他人讲解等。如果说输入能够在大脑中留存一部分知识,那么输出可以将这一部分进一步扩大。不断输出各方面的学习内容,在帮助他人的同时,也帮助自己建立强大的知识体系。在这一过程中,会有人和你讨论更优的解法,帮你厘清思路,这些对个人提升也很有帮助。