描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787121412783
本书对力扣(LeetCode)中的经典题目及背后的知识体系进行系统的梳理,依次展开讲解,由浅入深。
带领读者理解算法知识、总结解题“套路”、掌握通关技巧。
为了方便读者学习、参考,书中每一段代码都给出了多种语言的实现。
这是一本图文并茂的力扣(LeetCode)题解书,旨在让广大读者理解数据结构和算法的知识,掌握解决各类经典题目的基本技能,陪伴读者攻克算法难关。
本书通过算法题解的形式讲解了基本数据结构和算法知识,包括分治、贪心、回溯和动态规划等算法思想,二分查找、深度优先遍历和广度优先遍历、双指针、滑动窗口、位运算、并查集等解题思路和技巧,以及通用解题“套路”和解题模板等内容,引导读者了解并掌握解决算法题目的方式、方法,旨在循序渐进地提高读者应对算法题目的能力。
本书适合数据结构和算法知识的学习者,希望学习如何解算法题或正在刷题的计算机行业从业者,也可作为大、中专院校相关专业的辅导参考书。
第1章 预备知识 1
1.1 学习算法需要数学知识吗 1
1.2 基础数据结构和算法 2
1.3 复杂度分析 3
总结 12
第2章 数学之美 14
2.1 两数之和 14
2.2 三数之和 18
2.3 四数之和 19
2.4 四数相加II 22
2.5 接近的三数之和 24
2.6 子序列和 26
2.7 数 31
2.8 分数到小数 33
2.9 整除子集 35
2.10 质数排列 37
总结 39
第3章 回文的艺术 41
3.1 验证回文字符串Ⅱ 41
3.2 回文链表 44
3.3 回文数 47
3.4 长回文子串 48
3.5 长回文子序列 50
3.6 超级回文数 53
总结 56
第4章 游戏之乐 58
4.1 外观数列(报数) 58
4.2 24点 61
4.3 数独游戏 67
4.4 生命游戏 75
总结 78
第5章 深度优先遍历和广度优先遍历 79
5.1 深度优先遍历 79
5.2 广度优先遍历 81
5.3 路径和系列问题 82
5.4 岛屿问题 91
总结 100
第6章 二分法 102
6.1 二分查找 102
6.2 寻找旋转排序数组中的小值 105
6.3 爱吃香蕉的珂珂 107
6.4 x的平方根 109
6.5 寻找峰值 112
6.6 分割数组的值 114
总结 118
第7章 位运算 119
7.1 位1的个数 120
7.2 实现加法 122
7.3 整数替换 124
7.4 只出现一次的数字 127
总结 133
第8章 设计 135
8.1 小栈 135
8.2 实现 Trie(前缀树) 142
8.3 LRU 缓存机制 146
8.4 LFU 缓存 149
8.5 设计跳表 155
总结 163
第9章 双指针 164
9.1 头/尾指针 166
9.2 快慢指针 171
总结 182
第10章 动态规划 183
10.1 爬楼梯 186
10.2 打家劫舍系列 188
10.3 不同路径 195
10.4 零钱兑换 199
总结 204
第11章 滑动窗口 205
11.1 滑动窗口值 206
11.2 小覆盖子串 209
11.3 替换后的长重复字符 213
11.4 字符串的排列 216
总结 219
第12章 博弈问题 220
12.1 石子游戏 220
12.2 预测赢家 225
12.3 Nim 游戏 230
12.4 猜数字大小II 233
总结 236
第13章 股票问题 237
13.1 买卖股票的时机 237
13.2 买卖股票的时机II 240
13.3 买卖股票的时机(含手续费) 242
13.4 买卖股票的时机(含冷冻期) 247
13.5 买卖股票的时机IV 249
总结 253
第14章 分治法 254
14.1 合并k个排序链表 255
14.2 数组中的第k个元素 260
14.3 搜索二维矩阵 II 265
总结 274
第15章 贪心法 276
15.1 分发饼干 276
15.2 跳跃游戏 278
15.3 任务调度器 282
15.4 分发糖果 284
15.5 无重叠区间 287
总结 289
第16章 回溯法 290
16.1 组合总和 I 290
16.2 组合总和 II 296
16.3 子集 299
16.4 全排列 300
16.5 解数独 301
总结 304
第17章 一些有趣的题目 306
17.1 求众数 II 306
17.2 柱状图中的矩形 309
17.3 一周中的第几天 314
17.4 水壶问题 317
17.5 可怜的小猪 321
总结 325
第18章 一些通用解题模板 326
18.1 二分法 326
18.2 回溯法 329
18.3 并查集 330
18.4 BFS 333
18.5 滑动窗口 334
18.6 数学 336
总结 339
第19章 融会贯通 340
19.1 循环移位问题 340
19.2 编辑距离 349
19.3 第k问题 357
总结 369
第20章 解题技巧和面试技巧 370
20.1 看限制条件 371
20.2 预处理 380
20.3 不要忽视暴力法 388
20.4 降维与状态压缩 395
20.5 猜测tag 402
总结 403
前言
作为计算机科学永恒的主题之一,数据结构和算法被誉为程序的灵魂,对其掌握程度往往是衡量一个软件工程师内功的标准。但驾驭数据结构和算法并非易事,除了反复阅读理论知识,借助算法题目进行训练也是学习的必经之路。
1.本书的特点
本书围绕“做好的力扣(LeetCode)题解”的指导思想,对力扣(LeetCode)中的经典题目及背后的知识体系进行系统的梳理,依次展开讲解,由浅入深,力求全书内容系统而扼要,分析过程条理清晰,代码实现易读、易学。本书总计20章内容,在深入剖析近百道经典算法题目的过程中,带领读者理解算法知识、总结解题“套路”、掌握通关技巧。希望读者可以通过阅读本书并动手练习,让知识和技能得到质的提升。
作为专门针对力扣(LeetCode)题目的题解书,本书对数据结构和算法知识的讲解存在一定的局限性:为了不影响阅读的流畅性,不得不舍弃过于详细的解释证明,对部分知识点的讲解进行精简压缩,力求让内容通俗易懂。我们希望帮助读者奠定数据结构和算法知识的基础,指明方向。在本书的基础上,期望对算法理论进行深入学习的读者可以通过诸如《算法》等工具书,继续探索算法的奥妙。我们也会在第1章详细阐述学习路线。
2.读者对象
本书适用于如下类型的读者对象。
l 你正在学习数据结构和算法,希望边学边实践知识。
l 你没有刷过题,但具备一定的数据结构和算法的基础知识。
l 你刚开始刷题,希望极大地提升自己的学习效率。
l 你在刷题过程中遇到瓶颈,希望得到指引。
l 算法爱好者,希望了解更多不一样的思路。
对于完全没有接触过数据结构和算法的读者,作者强烈建议你先学习一下基础知识,比如数组、链表、二叉树,以及基础的排序、递归算法,等等。这个过程不需要很长时间,用几天时间了解一下即可。尽管越深入的理论学习对解题的帮助越大,但它们两者的关系是相辅相成的,解题对于巩固理论知识也会很有帮助,千万不要等到认为理论都完全掌握了才开始练习。
3.内容介绍
作为一本追求覆盖尽量多经典场景、经典问题的算法题解书,制定一种完美的题目编排顺序几乎是不可能的,不同的题目和不同的解题思路构成了网状的联系,很难做出取舍,因此,本书根据题目场景、算法思想、解题“套路”等主要特点将近百道算法题分散在了20章内容之中,它们并没有按照特定的顺序进行编排,读者可以根据自己的兴趣来挑选阅读。对于希望由易到难、循序渐进进行阅读的读者来说,下面的介绍可以作为一个阅读参考。
本书的20章内容总体可以被分为四大类别。
类是算法基础知识,包括第1章预备知识、第2章数学之美,旨在进行知识铺垫,解答一些读者关注较多的问题。
第二类是算法思想和算法技巧,这是涉及内容多的一个类别。第6章二分法和第14章分治法可以被看作对分治思想的实践;第9章双指针和第11章滑动窗口主要讲解了使用指针的技巧;第7章位运算旨在引导读者从二进制的角度思考问题;还有一些非常经典的算法思想,由易到难来看,包括第15章贪心法、第5章深度优先遍历和广度优先遍历、第16章回溯法、第10章动态规划。
第三类是经典算法问题,这些题目可能与某种具体的算法无关,但这些解题场景可以帮助读者在解答类似题目时拓展思路。其主要包括第3章回文的艺术、第4章游戏之乐、第8章设计、第12章博弈问题、第13章股票问题和第17章一些有趣的题目。
后一类是解题“套路”,顾名思义,这一类内容为读者总结了不少解题的模板和“套路”,包括第18章一些通用解题模板、第19章融会贯通、第20章解题技巧和面试技巧。
4.配套资源
本书中的源码使用Python语言编写,但为了方便读者学习、参考,书中每一段代码都给出了多种语言的实现,请通过本书的官方网站leetcode-solution(cn域名)访问查看,目前已涵盖Java语言、Python语言和C 语言相关的版本,我们会根据读者的反馈增加更多具体实现。
本书也提供了读者交流群,读者之间及读者和作者之间能够在这里进行有意义的交流,获得远超图书内容本身的学习体验。本书还在相应位置提供了参考链接以方便读者更好地了解书中提到的相关技术。
请在本书封底的“读者服务”处获取官方网站的地址、读者交流群二维码及相关参考链接。
5.本书的约定
本书使用不同的字体区分代码和一般正文内容,对重要的概念会进行加粗。
本书章节之间并没有逻辑上的先后顺序,读者可以根据自己的实际情况进行选择阅读。对于知识间有依赖关系的章节,我们会在具体位置给出指引,便于读者查阅其他相关章节的内容。每一章会尽量使用本章所要论述的算法来解题,但这也导致针对部分题目给出的解法有可能并不是的,这一点需要特别注意。
除个别证明过程较为复杂的解法没有进行说明外,大多数题目会有复杂度说明,另外,提交可能会超时的题解会在标题上注明。
6.写在后
为了让读者深入理解基本知识,掌握基本技能,在撰写本书的过程中,每一道题解都经过多位作者和审阅者的把关,他们不仅在专业性方面下足了功夫,更是从读者的角度反复揣摩。希望本书对读者的学习有所帮助,成为读者掌握数据结构和算法知识的奠基石、解题过程中的助推器。能够帮助读者解决学习和工作中遇到的问题,将是作者的荣幸。由于作者能力有限,本书难免存在不足之处,希望读者不吝赐教。
另外,推荐关注作者lucifer创办的公众号“力扣加加”,如果想突击学习算法,可以参加公众号上的“91天学算法”活动(在公众号中回复关键字“91”进行查看)。
7.致谢
为本书做出直接贡献的人很多,除几位作者外,还要感谢侯佳琳、李荣新、樊恒岩和王一村的耐心审阅。没有你们,就没有本书的出版。
感谢本书的编辑,你每次审稿都非常耐心,让我们一点点看到了出版的希望。
后,感谢我们的家人,没有你们的支持,我们可能无法坚持下来。
作者
2012年,我在美国初次面试软件工程师一职时,面试题目知识点零散,评价体系尚未标准化。但仅仅相隔几年时间,美国整个IT行业的面试体系已经变得高度标准化与结构化,非常注重算法与数据结构。在这样的大背景下,硅谷华人中涌现出了一大批“科班”“非科班”出身的软件工程师,他们通过刷题拿到了心仪的offer。算法与数据结构本身是相当抽象的,要想学好它们,可视化与直观的教学方式是相当重要的。本书通过剖析力扣(LeetCode)上的例题,以多元且直观的方式呈现解题思路,来帮助读者快速入门算法与数据结构,斩获心仪公司的offer。
蔡 循 博士
毕业于美国麻省理工学院电气工程与计算机科学专业,曾经在Google视频标准组、
YouTube及Google Research工作,目前从事机器学习和人工智能方向的创业
对于算法爱好者、学习者,或者有切实目标希望提升自身能力的同行来说,本书具备很高的参考价值。本书基于易学、易用的Python技术栈,同时每种解法都提供了Java、C 语言的实现版本,为读者提供了一个友好的算法学习环境。
刘 鑫
Python Tutorial译者,Scala组合子库Jaskell作者
无论从事什么方向的程序开发工作,具备扎实的算法知识都是一个解决问题的硬实力。《算法通关之路》是一本针对常用算法题且解读详实、通透的基础书,力荐大家入手学习。
秦金卫(kimmking)
Apache Dubbo/ShardingSphere PMC,曾任阿里巴巴/架构师,
长亮科技平台服务部副总经理兼北京技术团队负责人
我通过GitHub 4万个star的算法题解仓库与本书作者路志鹏相识,他是一名纯粹的算法爱好者,他的算法教程堪称独门绝技。向大家力荐这本《算法通关之路》,本书可以帮助读者快速掌握算法知识,成为算法面试中的佼佼者。
臧剑超
百度资深技术专家,印度SRM大学和英国曼彻斯特大学计算机科学专业双硕士
评论
还没有评论。