这是一本图文并茂的力扣(LeetCode)题解书,旨在让广大读者理解数据结构和算法的必备知识,掌握解决各类经典题目的基本技能,陪伴读者攻克算法题目的难关。
本书通过算法题解的形式讲解了基本数据结构和基础数学知识,包括贪心、递归、回溯和动态规划等算法思想,深度优先和广度优先、双指针、滑动窗口、位运算等解题技巧,以及通用解题“套路”和解题模板等内容,引导读者了解并掌握解决算法题目的方式、方法,旨在循序渐进地提高读者应对算法题目的能力。
Github 四万星题解,一书深入算法套路
前言
作为计算机科学永恒的主题之一,数据结构和算法被誉为程序的灵魂,对其掌握程度往往是衡量一个软件工程师内功的标准。但驾驭数据结构和算法并非易事,除了反复阅读理论知识,借助算法题目进行训练也是学习的必经之路。
1.本书的特点
本书围绕“做最好的力扣(LeetCode)题解”的指导思想,对力扣(LeetCode)中的经典题目及背后的知识体系进行系统的梳理,依次展开讲解,由浅入深,力求全书内容系统而扼要,分析过程条理清晰,代码实现易读、易学。本书总计20章内容,在深入剖析近百道经典算法题目的过程中,带领读者理解算法知识、总结解题“套路”、掌握通关技巧。希望阅读本书之后,读者的知识和技能都可以得到质的提升。
作为专门针对力扣(LeetCode)题目的题解书,本书对数据结构和算法知识的讲解存在一定的局限性:为了不影响题解的流畅性,不得不舍弃全面详细的解释证明,对许多知识点的讲解都做了精简压缩;在力求通俗易懂的同时,内容上确实存在着不够深入的遗憾。我们希望帮助读者奠定数据结构和算法知识的基础,指明方向,在本书的基础上,期望进一步学习的读者可以通过诸如《算法》等工具书,继续深入学习和探索算法的奥妙。我们也会在第1章详细阐述学习路线。
2.读者对象
本书适用于如下类型的读者对象。
-你正在学习数据结构和算法,希望边学边实践知识。
-你没有刷过题,但具备一定的数据结构和算法的基础知识。
-你刚开始刷题,希望极大地提升自己的学习效率。
-你在刷题过程中遇到瓶颈,希望得到指引。
-算法爱好者,希望了解更多不一样的思路。
对于完全没有接触过数据结构和算法的读者,作者强烈建议你先学习一下基础知识,比如数组、链表、二叉树,以及基础的排序、递归算法,等等。这个过程不需要很长,也许只需要用几天时间了解一下即可。尽管越深入的理论学习对解题的帮助越大,但它们两者的关系是相辅相成的,解题对于巩固理论知识也会很有帮助,千万不要等到认为理论都完全掌握了才开始练习解题。
3.配套资源
官方网站
本书是使用Python语言编写的,为了方便读者,我们在本书的官方网站中开辟了一个区域,读者可以访问并查看本书所有题解的配套代码,包括Java语言、Python语言和C++语言相关的版本,并且我们会根据读者的反馈增加更多具体实现。官方网站是http://leetcode-solution.cn/book。
官方交流群
读者可以用QQ扫描下方的二维码,进入官方交流群,读者之间及读者和作者之间能够在这里进行有意义的交流,获得远超图书内容本身的学习体验。
4.本书的约定
本书使用不同的字体区分代码和一般正文内容,对重要的概念会进行加粗。
本书章节之间并没有逻辑上的先后顺序,读者可以根据自己的实际情况进行选择阅读。对于知识间有依赖关系的章节,我们会在具体位置给出指引,便于读者查阅其他相关章节的内容。每一章会尽量使用本章所要论述的算法来解题,但这也导致针对部分题目给出的解法有可能并不是最优的,这一点需要特别注意。
除个别证明过程较为复杂的解法没有进行说明外,大多数题目会有复杂度说明,另外,提交可能会超时的题解会在标题上注明。
5.参考资料
本书提供了大量的参考资料以方便读者更好地了解书中提到的相关技术及工具。为了保证参考资料相关链接能够实时更新,特将“参考资料”文档放于博文视点官方网站,读者可在http://www.broadview.com.cn/ *****页面进行下载。
6.写在最后
为了让读者深入理解基本知识,掌握基本技能,在撰写本书的过程中,每一道题解都经过多位作者和审阅者的把关,他们不仅在专业性方面下足了功夫,更是从读者的角度反复揣摩。希望本书对读者的学习有所帮助,成为读者掌握数据结构和算法知识的奠基石、解题过程中的助推器。能够帮助读者解决学习和工作中遇到的问题,将是作者的荣幸。由于作者能力有限,本书难免存在不足之处,希望读者不吝赐教。
读者也可以关注作者的公众号“力扣加加”,作者会带你啃下算法这块硬骨头。如果你想突击学习算法,也可以参加公众号上的“91天学算法”活动,详细内容可以在公众号中回复关键字“91”进行查看。
7.致谢
为本书做出直接贡献的人很多,这包括但不限于内容、格式及图片方面的贡献。没有你们,就没有这本书的顺利出版,在这里衷心感谢为本书做出贡献的各位。
感谢编辑小姐姐,你的每一次审稿都非常耐心,让我们看到了出版的希望,为你点赞。
最后,感谢我们的家人,没有你们的支持,我们可能无法坚持下来。
作者序
力扣(LeetCode),不同于信息学相关的竞赛,其大部分题目难度不大,但通常是互联网大厂校招或社招的“敲门砖”。
本书偏向实战,读者要注意理论与实战必须相结合。
1.如何入门
算法知识体系对于解题来说很重要,而体系的建立依赖于扎实的基础,因此了解数据结构和算法基础是必经之路。
学习算法就像拓扑排序,若没有任何的解题经验,几乎不可能独立编写一个算法来解决新问题。个人认为积累经验是最关键的部分,当我们积累的经验达到一定程度的时候,就可以从新题中找到旧题的影子,进一步联想过去所使用的解法,并加以转换,从而解决新的问题了。
到目前为止,我已经刷了800多道题目,但前200 道题目几乎是看着答案写的。刚开始接触力扣(LeetCode)时,我尝试独立解题,经常是一道题目想一天。我慢慢地发现这样的效率不够高,并且极大地影响了刷题的心情。我尝试转换策略,以积累经验为目标去刷题,不强求自己能够想到解题方案,而更注重阅读别人的解题思路,理解算法思想。这种方式使我在短期内学会了各种算法“套路”,同时在后面刷题的过程中也更加得心应手了。
如何快速积累经验呢?首先是刷题策略,推荐每次集中火力攻克一种tag的题目,不断地重复对同类题型的理解和记忆,短期内快速提高对这类题型的解题能力。然后是题目选择,可以查阅别人整理好的力扣(LeetCode)题目,重点关注经典题型。最后是解题方法,给每道题目限定一个思考时间,一般不超过半小时,想不到答案的话就看题解,从题解中理解算法的思想及主要流程。
这里给各位读者推荐几本算法学习的图书及相关视频。
经典图书
-入门书:《算法图解》《大话数据结构》。
-面试准备:《剑指Offer》《编程之美》。
-系统学习:《算法》(第4版)。
视频
-邓俊晖的《数据结构与算法》视频课程,可以帮助你建立完整的知识框架。
为了帮助读者更有效率地刷题,我开发了一个 Chrome 插件leetcode cheatsheet,插件里面有一些解题模板、题解及专题等。插件地址:https://chrome.google. com/webstore/detail/leetcode-cheatsheet/fniccleejlofifaakbgppmbbcdfjonle。
2.跨越瓶颈
有人问为什么刷了很多题,但遇到新的题目还是不会呢?
很多人在刷题的过程中迷失了自我。感觉“刷了很多题,但是看到新的题目还是不会”,甚至“看到了以前刷过的题目,还是不会”。这实际上和多种因素有关。我在这里提两个比较常见的原因:基础差和没有良好的刷题方法。
-如果本身基础比较差,那么刷再多的题目也是枉然,并且效率很低,这和高考的题海战术是一样的道理。当大家走上考场,碰到新的问题时,如果没有真正掌握相关知识,即使之前刷了很多题,但还是很难解决新问题。这时应该多看书或视频进行学习,而不是一味地刷题。
-所谓“磨刀不误砍柴工”,掌握良好的刷题方法可以让你事半功倍。关于如何刷力扣(LeetCode),可以参考本书的参考资料部分,我从自身经验出发总结了一套刷题的攻略,不保证适合所有人,但也确实得到了不少人的认可,这说明它还是有一定参考价值的。
当刷题陷入瓶颈时,各位读者可以反思一下是否是以上两种原因。如果是,那么可以试试我所提到的攻略。
3.如何进阶
有了一定的基础之后,还需要认真做好每一道题目。想要做好力扣(LeetCode)题目,不在于做的题目有多少,而在于是否做得够“精”。在做题时,我们需要研究题目的所有解法和解法背后的含义,这样才能举一反三。善于总结、思考才是必胜之道。
4.输出
上面的过程只提到了知识的输入,实际上学习的过程绝不仅仅是输入,还有很大的比重在于输出。而输出有多种形式,比如练习题、写题解、给他人讲解等。如果说输入能够在大脑中留存一部分知识,那么输出可以将这一部分进一步扩大。
我本人有写题解的习惯。除此之外,我还会不断输出各方面的学习内容,在帮助他人的同时,也帮助自己建立强大的知识体系。并且在这一过程中,也会有一些人和你讨论更优的解法,这对个人提升是非常重要的。