labuladong的算法小抄PDF完整版|百度网盘下载

编辑评论:

《labuladong 算法备忘单》由电子工业出版社于 2020 年 11 月出版,作者为傅东来 (@labuladong)。这本书用一种流行的语言描述了算法,有数百个有趣的算法插图和一些动画演示。

labuladong算法备忘单 PDF

简介

《labuladong's Algorithm Cheat Sheet》专业解决算法问题,训练算法思维,处理算法笔试。注重用套路和框架思维解决问题,适应变化。第 1 章列出了几种最常见的算法类型及其对应的问题解决框架思想,包括动态规划、回溯、广度优先搜索以及双指针和滑动窗口等算法技术。第2章用动态规划的一般思想解决了十几个经典的动态规划问题,如正则表达式和背包问题,还介绍了如何编写状态转移方程,如何进行状态压缩等技术。第三章介绍了数据结构相关的算法,比如二叉树相关问题的解决方案,以及面试中经常测试的LRU、LFU等算法原理。第4章介绍了回溯算法、广度优先搜索算法等核心例程在算法问题中的应用,巩固了对算法框架的理解。第 5 章解释了一些高频主题。每个题目可能结合多种算法思路进行讲解,也可能有多种解法。读完本章,你可以独自探索问题的海洋!

关于作者

傅东来

微信公众号labuladong的作者,有多年写题经验。他希望用共同语言帮助互联网从业者少走弯路,快速从根本上攻克算法难点,赋能职业发展路径。

labuladong 的算法备忘单 PDF 预览

目录

第 1 章核心例程 / 21

1.1 学习算法与写题框架思考/21

1.1.1 数据结构的存储方式 / 21

1.1.2 数据结构的基本操作/23

1.1.3 算法刷机指南/25

1.1.4 最终总结 / 30

1.2 动态规划问题求解例程框架/31

1.2.1 斐波那契数列 / 32

1.2.2 收零问题/37

1.2.3 最终总结 / 42

1.3 回溯算法问题求解例程框架/43

1.3.1 全排列问题/43

1.3.2 N 皇后问题 / 48

1.3.3 最终总结 / 51

1.4 BFS算法例程框架/53

1.4.1 算法框架/53

1.4.2 二叉树的最小高度/54

1.4.3 最小开锁次数/56次

1.5 双指针技能例程框架/64

1.5.1 快慢指针常用算法/64

1.5.2 左右指针常用算法/68

1.6 我写了一首诗来确保你可以闭着眼睛写一个二分搜索算法 / 71

1.6.1 二分搜索框架 / 72

1.6.2 找数(基本二分查找)/73

1.6.3 二分查找左边界/75

1.6.4 二分查找右边界/79

1.6.5 逻辑统一/82

1.7 我写了一个模板,把滑动窗口算法变成听写题/85

1.7.1 最小覆盖子串/87

1.7.2 字符串排列/91

1.7.3 查找所有字谜/93

1.7.4 最长不重复子串/94

第 2 章动态规划系列 / 96

2.1 动态规划设计:最长递增子序列/96

2.1.1 动态规划解/97

2.1.2 二分查找方案/100

2.2 二维递增子序列:包络嵌套问题/104

2.2.1 主题概述/104

2.2.2 思想分析/105

2.2.3 最终总结 / 107

2.3 最大子数组问题/108

2.3.1 思想分析/108

2.3.2 最终总结 / 110

2.4 动态规划问答:最优子结构和dp遍历方向/111

2.4.1 最优子结构详解/111

2.4.2 dp数组/113的遍历方向

2.5 经典动态规划:最长公共子序列/117

2.6 经典动态规划:编辑距离/123

2.6.1 思想分析/124

2.6.2 代码说明/125

2.6.3 动态规划优化/129

2.6.4 扩展/131

2.7 子序列问题求解模板:最长回文子序列/136

2.7.1 两种方式/136

2.7.2 最长回文子序列/137

2.7.3 代码实现/139

2.8 状态压缩:动态规划的降维打击 / 141

2.9 构造插入次数最少 / 148 的回文

2.9.1 思想分析/148

2.9.2 状态转移方程/149

2.9.3 代码实现/152

2.10 动态规划的正则表达式/155

2.10.1 思想分析/155

2.10.2 动态规划解/157

2.11 不同的定义产生不同的解决方案 / 162

2.11.1 第一个想法/162

2.11.2 第二种思路/165

2.11.3 最终总结 / 167

2.12 经典动态规划:从高楼扔鸡蛋 / 168

2.12.1 解析题/168

2.12.2 思想分析/169

2.12.3 故障排除/172

2.13 经典动态规划:高楼扔鸡蛋(进阶)/173

2.13.1 二分查找优化/173

2.13.2 重新定义状态转换 / 176

2.13.3也可以优化/180

2.14 经典动态规划:戳气球问题/181

2.14.1 回顾性思考/181

2.14.2 动态编程思想/182

2.14.3 写出代码/185

2.15 经典动态规划:0-1 背包问题/188

2.16 经典动态规划:子集背包问题/192

2.16.1 问题分析/192

2.16.2 思想分析/193

2.16.3 状态压缩/194

2.17 经典动态规划:完整的背包问题/196

2.18 话题千变万化,套路不会变/200

2.18.1 线性排列/200

2.18.2 圆形排列/203

2.18.3 树排列/205

2.19 动态规划和回溯算法有什么关系/207

2.19.1 回顾性思考/207

2.19.2 消除重叠子问题 / 210

2.19.3 动态规划/211

第三章数据结构系列/216

3.1 教你写LRU缓存消除算法/216

3.1.1 LRU算法描述/218

3.1.2 LRU算法设计/219

3.1.3 代码实现/220

3.2层层拆解,带你手写LFU算法/227

3.2.1 算法描述/227

3.2.2 思想分析/228

3.2.3 代码框架/230

3.2.4 LFU核心逻辑/232

3.3 二叉搜索树操作合集/235

3.3.1 判断BST/236的合法性

3.3.2 查找BST / 238中是否存在数字

3.3.3 在 BST 中插入一个数字/239

3.3.4 删除 BST 中的数字 / 239

3.4 为什么一棵完全二叉树的节点数这么难计算/243

3.4.1 思想分析/244

3.4.2 复杂度分析/245

3.5 使用各种遍历框架对二叉树进行序列化和反序列化 / 247

3.5.1 标题说明 / 247

3.5.2 前序遍历解/248

3.5.3 后序遍历解/252

3.5.4 中序遍历解/255

3.5.5 分层遍历解/255

3.6 Git原理二叉树最近共同祖先/260

3.6.1 二叉树的最后一个共同祖先 / 261

3.6.2 思想分析/263

3.7 特殊数据结构:单调栈/266

3.7.1 单调栈问题求解模板/266

3.7.2 标题变化/268

3.7.3 如何处理圆形数组/268

3.8 特殊数据结构:单调队列 / 271

3.8.1 构建问题解决框架/271

3.8.2 实现单调队列数据结构 / 273

3.8.3 算法复杂度分析/276

3.9 如何判断回文链表/277

3.9.1 判断回文单链表/277

3.9.2 优化空间复杂度/280

3.9.3 最终总结 / 282

3.10 纯递归反向链表显示操作/283

3.10.1 递归反转整个链表/283

3.10.2 反转链表的前N个节点/286

3.10.3 链表的反转部分/287

3.10.4 最终总结 / 288

3.11 show操作的k个反向链表的集合/289

3.11.1 分析问题 / 289

3.11.2 代码实现/291

3.11.3 最终总结 / 292

第四章算法思维系列/293

4.1 解决子集、组合和排列问题的回溯算法 / 293

4.1.1 子集/293

4.1.2 组合/297

4.1.3 安排/299

4.2 回溯算法的最佳实践:解决数独/301

4.2.1 直觉/301

4.2.2 代码实现/301

4.3 回溯算法的最佳实践:括号生成/306

4.4 BFS算法暴力破解各种谜题/310

4.4.1 问题分析/311

4.4.2 思想分析/311

4.5 2Sum问题的核心思想/315

4.5.1 2Sum I/315

4.5.2 2Sum II / 316

4.5.3 最终总结 / 318

4.6 解决 nSum 问题的函数 / 319

4.6.1 2Sum 问题 / 319

4.6.2 3Sum 问题 / 322

4.6.3 4Sum 问题/324

4.6.4 100Sum 问题/325

4.7 解包复杂问题:实现计算器 / 328

4.7.1 字符串转整数/328

4.7.2 处理加减法/329

4.7.3 处理乘法和除法 / 331

4.7.4 处理括号/333

4.7.5 最终总结 / 336

4.8 拖延饼干也得有点递归思维/337

4.8.1 思想分析/338

4.8.2 代码实现/339

4.9 解决子数组问题的前缀和技巧/341

4.9.1 什么是前缀和/341

4.9.2 优化解决方案 / 343

4.9.3 最终总结 / 344

4.10 扁平化嵌套列表 / 345

4.10.1 标题说明 / 345

4.10.2 解决问题的思路/346

4.10.3 进阶思路/349

第5章高频采访/351

5.1 如何高效求素数/351

5.2 如何高效地执行模幂运算 / 355

5.2.1 如何处理数组索引/355

5.2.2 如何处理 mod 操作 / 356

5.2.3 如何有效地执行幂运算 / 358

5.3 如何使用二分查找算法/360

5.3.1 问题分析/360

5.3.2 扩展/362

5.4 如何高效解决雨水接收问题/364

5.4.1 核心思想/364

5.4.2 备忘录优化/366

5.4.3 两指针解/367

5.5 如何去除有序数组中的重复元素/371

5.6 如何找到最长的回文子串/373

5.6.1 思考/373

5.6.2 代码实现/374

5.7 如何用贪心思维玩跳跃游戏/376

5.7.1 跳跃游戏 I / 376

5.7.2 跳跃游戏 II / 377

5.8 如何使用贪心算法进行时间管理/381

5.8.1 问题概述 / 381

5.8.2 贪婪解决方案 / 381

5.8.3 应用示例/383

5.9 如何判断括号的合法性/386

5.9.1 处理一种括号/386

5.9.2 处理多个括号/387

5.10 如何安排考生座位/389

5.10.1 思想分析/390

相关介绍

前言

本仓库共有60多篇原创文章,基本上都是基于LeetCode主题,涵盖所有类型的问题和技巧,并且必须从其他事实中推断出来,易于理解,而不是简单的代码堆叠,然后是目录。

我将从几句咆哮开始。这个仓库的目的就是传达这种算法思维。如果我只是写一个包含 LeetCode 主题代码的存储库,我有锤子吗?没有idea解释,没有思维框架,顶多时间复杂度,那个东西一眼就能看出来。

只想要答案很容易。话题评论区有多种答案。用python中的一行代码就可以轻松解决,喜欢的人也很多。问题是,当你做算法问题时,你是想学习编程语言的技巧,还是想学习算法思维?你的快乐来自于抄别人的代码通过测试并完成题+1,还是来自于自己通过逻辑推理和算法框架编写解决方案而不看答案?

网上总有大佬批评我,说我写这些东西太基础了,没必要大惊小怪。只能说大家找工作是为了找工作,不是为了竞争。我也是一路过来的。我们要的是清醒,有所收获,而不是自欺欺人。不想让它通俗易懂,是不是要先上来吹一波《算法导论》,然后劝大家赞叹不已?别的不说,公众号有几万读者,PDF版下载了几万次,有几个出版社联系过我,质量还不错吧?

如果你做很多事情,你可以找到套路。我总结了各种算法例程和框架。相信可以帮助别人少走弯路。我,一个自学成才的童鞋,花了一年的时间审题总结,自己写了一份算法备忘单。后面有目录,这里就不废话了。

阅读剩余
THE END