具体描述
《代码随想录——跟着Carl学算法》归纳了程序员面试中的经典算法题,并按照由浅入深、循序渐进的顺序讲解。
《代码随想录——跟着Carl学算法》首先讲解程序员面试时需要了解的制作简历的技巧和IT名企的面试流程,以及面试时经常忽略的代码规范性问题。然后详细分析程序的时间复杂度和空间复杂库,包括如何把控程序的实际运行时间,以及编程语言的内存管理。接着讲解数组、链表、哈希表、字符串、栈与队列、二叉树、回溯算法、贪心算法、动态规划的理论基础及其相关题目。
《代码随想录——跟着Carl学算法》采用了力扣(LeetCode)的原题,方便读者在学习算法的同时,及时练习相关代码,加深对相关概念的理解。
《代码随想录——跟着Carl学算法》适合所有程序员阅读,特别是正在准备面试的程序员。希望本书可以帮助读者循序渐进地学习算法,并搭建起知识框架,提升算法功力。
作者简介
孙秀洋(@程序员Carl)
哈尔滨工业大学计算机科学与技术专业硕士,先后在腾讯和百度从事技术研发,微信公众号“代码随想录”作者,对数据结构与算法有深刻理解,擅长将一个个算法串联在一起并用通俗易懂的方式讲解出来。
目录信息
1.1 面试官为什么要考查算法 1
1.2 编程语言 2
1.2.1 学好算法之前更要学好编程语言 2
1.2.2 代码规范 2
1.3 如何写简历 5
1.3.1 简历模板 5
1.3.2 谨慎使用“精通” 5
1.3.3 拿不准的内容绝对不要写在简历上 5
1.3.4 项目经验应该如何写 6
1.3.5 博客的重要性 7
1.4 企业技术面试的流程 7
1.4.1 一面——机试面 7
1.4.2 二面——基础算法面 8
1.4.3 三面——综合技术面 8
1.4.4 四面——技术leader面 8
1.4.5 五面——HR面 9
1.5 本章小结 10
第2章 程序的性能分析 11
2.1 时间复杂度分析 11
2.1.1 什么是时间复杂度 11
2.1.2 如何描述时间复杂度 12
2.1.3 递归算法的时间复杂度分析 14
2.2 程序的运行时间 17
2.2.1 超时是怎么回事 17
2.2.2 从硬件配置看计算机的性能 18
2.2.3 测试计算机的运行速度 18
2.3 编程语言的内存管理 20
2.3.1 C++的内存管理 21
2.3.2 如何计算程序占用多少内存 22
2.3.3 内存对齐 22
2.4 空间复杂度分析 24
2.4.1 什么是空间复杂度 24
2.4.2 递归算法的空间复杂度分析 25
2.4.3 以空间换时间是常见的优化思路 32
2.5 本章小结 33
第3章 数组 34
3.1 数组理论基础 34
3.2 二分查找 36
3.2.1 二分法写法(一) 37
3.2.2 二分法写法(二) 38
3.3 移除元素 39
3.3.1 暴力解法 40
3.3.2 双指针法 41
3.4 长度最小的子数组 42
3.4.1 暴力解法 42
3.4.2 滑动窗口 43
3.5 这个循环转懵了很多人 45
3.5.1 循环不变量 45
3.5.2 代码实现 46
3.6 本章小结 48
第4章 链表 49
4.1 链表理论基础 49
4.1.1 链表的类型 49
4.1.2 链表的存储方式 50
4.1.3 链表的定义 51
4.1.4 链表的操作 52
4.1.5 性能分析 52
4.2 用虚拟头节点会方便得多 53
4.3 链表常见的六个操作 57
4.4 反转链表 60
4.4.1 双指针法 60
4.4.2 递归法 61
4.5 删除倒数第n个节点 62
4.6 环形链表 64
4.6.1 判断链表是否有环 65
4.6.2 寻找环的入口 66
4.7 本章小结 69
第5章 哈希表 70
5.1 哈希表理论基础 70
5.1.1 哈希函数 71
5.1.2 哈希碰撞 71
5.1.3 常见的三种哈希结构 73
5.2 有效的字母异位词 74
5.3 两个数组的交集 76
5.4 两数之和 78
5.5 四数相加 80
5.6 三数之和 81
5.6.1 哈希解法 81
5.6.2 双指针法 82
5.7 四数之和 85
5.8 本章小结 87
第6章 字符串 88
6.1 字符串与数组的区别 88
6.2 反转字符串 89
6.3 反转字符串II 90
6.4 反转字符串里的单词 92
6.5 KMP算法理论基础 96
6.5.1 什么是KMP算法 96
6.5.2 什么是前缀表 96
6.5.3 为什么一定要用前缀表 97
6.5.4 如何计算前缀表 98
6.5.5 时间复杂度分析 100
6.6 使用KMP匹配字符串 101
6.6.1 构造next数组 101
6.6.2 使用next数组做匹配 103
6.6.3 前缀表统一减一的代码实现 104
6.6.4 前缀表(不减一)的代码实现 105
6.7 找到重复的子字符串 107
6.8 本章小结 109
第7章 栈与队列 110
7.1 栈与队列理论基础 110
7.2 用栈组成队列 112
7.3 用队列组成栈 114
7.3.1 使用两个队列实现栈 115
7.3.2 使用一个队列实现栈 117
7.4 匹配括号 118
7.5 逆波兰表达式 120
7.6 滑动窗口最大值 122
7.7 前k个高频元素 126
7.8 接雨水 129
7.8.1 双指针解法 130
7.8.2 动态规划解法 132
7.8.3 单调栈解法 133
7.9 本章小结 137
第8章 二叉树 139
8.1 二叉树理论基础 139
8.1.1 二叉树的种类 139
8.1.2 二叉树的存储方式 141
8.1.3 二叉树的遍历方式 142
8.1.4 二叉树的定义 143
8.2 前、中、后序的递归遍历 144
8.3 前、中、后序的迭代遍历 146
8.3.1 前序遍历 146
8.3.2 中序遍历 147
8.3.3 后序遍历 148
8.4 前、中、后序统一迭代法 149
8.5 二叉树的层序遍历 152
8.6 反转二叉树 155
8.6.1 递归法 156
8.6.2 迭代法 156
8.7 对称二叉树 158
8.7.1 递归法 159
8.7.2 迭代法 162
8.8 二叉树的最大深度 164
8.8.1 递归法 165
8.8.2 迭代法 166
8.9 二叉树的最小深度 167
8.9.1 递归法 168
8.9.2 迭代法 170
8.10 平衡二叉树 170
8.10.1 递归法 173
8.10.2 迭代法 175
8.11 二叉树的所有路径 176
8.11.1 递归法 177
8.11.2 迭代法 182
8.12 路径总和 183
8.12.1 递归法 183
8.12.2 迭代法 186
8.12.3 路径总和II 187
8.13 构造一棵二叉树 189
8.13.1 使用中序与后序遍历序列构造二叉树 189
8.13.2 使用前序与中序遍历序列构造二叉树 195
8.13.3 相关思考 197
8.14 合并两棵二叉树 197
8.14.1 递归 198
8.14.2 迭代法 200
8.15 在二叉搜索树中寻找节点 201
8.15.1 递归法 202
8.15.2 迭代法 203
8.16 验证二叉搜索树 204
8.16.1 递归法 205
8.16.2 迭代法 207
8.17 二叉搜索树的最小绝对差 208
8.17.1 递归法 208
8.17.2 迭代法 209
8.18 二叉搜索树中的众数 210
8.18.1 递归法 211
8.18.2 迭代法 215
8.19 二叉树的最近公共祖先 216
8.19.1 普通二叉树 216
8.19.2 二叉搜索树 221
8.20 在二叉搜索树中插入一个节点 224
8.20.1 递归法 225
8.20.2 迭代法 227
8.21 在二叉搜索树中删除一个节点 228
8.21.1 递归法 228
8.21.2 迭代法 230
8.22 修剪二叉搜索树 231
8.22.1 递归法 232
8.22.2 迭代法 234
8.23 构造一棵平衡二叉搜索树 235
8.23.1 递归法 236
8.23.2 迭代法 238
8.24 本章小结 239
第9章 回溯算法 240
9.1 回溯算法理论基础 240
9.1.1 什么是回溯算法 240
9.1.2 回溯法的性能 240
9.1.3 回溯法可以解决的问题 240
9.1.4 如何理解回溯法 241
9.1.5 回溯法模板 241
9.2 组合问题 243
9.2.1 回溯算法 244
9.2.2 剪枝优化 248
9.3 组合总和(一) 250
9.3.1 回溯算法 251
9.3.2 剪枝优化 254
9.4 电话号码的字母组合 255
9.5 组合总和(二) 260
9.5.1 回溯算法 261
9.5.2 剪枝优化 263
9.6 组合总和(三) 265
9.7 分割回文串 270
9.8 复原IP地址 274
9.9 子集问题(一) 279
9.10 子集问题(二) 281
9.11 递增子序列 284
9.11.1 回溯算法 285
9.11.2 哈希优化 287
9.12 排列问题(一) 288
9.13 排列问题(二) 291
9.13.1 回溯算法 291
9.13.2 拓展 293
9.14 N皇后问题 296
9.15 解数独 301
9.15.1 回溯算法 302
9.15.2 判断棋盘是否合法 304
9.16 本章小结 305
第10章 贪心算法 306
10.1 贪心算法理论基础 306
10.1.1 什么是贪心 306
10.1.2 贪心的套路 306
10.2 分发饼干 307
10.3 摆动序列 309
10.4 最大子序和 312
10.5 买卖股票的最佳时机II 314
10.6 跳跃游戏 316
10.7 跳跃游戏II 318
10.7.1 贪心解法(一) 320
10.7.2 贪心解法(二) 320
10.8 加油站 322
10.8.1 暴力解法 323
10.8.2 贪心解法(一) 324
10.8.3 贪心解法(二) 325
10.9 分发糖果 327
10.10 柠檬水找零 330
10.11 用最少数量的箭射爆气球 332
10.12 合并区间 335
10.13 单调递增的数字 338
10.13.1 暴力解法 338
10.13.2 贪心解法 339
10.14 本章小结 340
第11章 动态规划 341
11.1 动态规划理论基础 341
11.1.1 动态规划题目的解题步骤 341
11.1.2 动态规划应该如何排查问题 342
11.2 斐波那契数 343
11.2.1 动态规划解法 344
11.2.2 递归解法 345
11.3 爬楼梯 346
11.4 使用最低花费爬楼梯 349
11.5 不同路径(一) 353
11.5.1 深度优先搜索 354
11.5.2 动态规划 355
11.5.3 数论方法 356
11.6 不同路径(二) 358
11.7 整数拆分 361
11.7.1 动态规划 362
11.7.2 贪心算法 364
11.8 不同的二叉搜索树 364
11.9 0-1背包理论基础 369
11.9.1 二维dp数组 370
11.9.2 一维dp数组 375
11.10 分割等和子集 379
11.11 目标和 382
11.12 一和零 385
11.13 完全背包理论基础 388
11.14 零钱兑换(一) 392
11.15 拼凑一个正整数 395
11.16 多步爬楼梯 398
11.17 零钱兑换(二) 399
11.18 完全平方数 402
11.19 单词拆分 405
11.19.1 回溯算法 406
11.19.2 背包问题 407
11.20 买卖股票的最佳时机 410
11.20.1 暴力枚举 410
11.20.2 贪心算法 411
11.20.3 动态规划 411
11.21 买卖股票的最佳时机II 414
11.22 买卖股票的最佳时机III 416
11.23 买卖股票的最佳时机IV 420
11.24 最佳买卖股票时机(含冷冻期) 423
11.25 买卖股票的最佳时机(含手续费) 426
11.26 最长递增子序列 428
11.27 最长连续递增序列 430
11.27.1 动态规划 430
11.27.2 贪心算法 432
11.28 最长重复子数组 433
11.29 最长公共子序列 436
11.30 不相交的线 438
11.31 最大子序和 440
11.32 判断子序列 441
11.33 不同的子序列 444
11.34 两个字符串的删除操作 447
11.35 编辑距离 450
11.36 回文子串 453
11.36.1 动态规划 453
11.36.2 双指针法 456
11.37 最长回文子序列 457
11.38 本章小结 460
· · · · · · (收起)
读后感
算法最重要的是实操,但面对leetcode上成千道题,一个好的刷题策略是必不可少的。卡哥的代码随想录,是我第一个认真刷的刷题路线,这个了路线由浅入深,归纳总结了很多核心题目。跟着卡哥的路线,我收获很大,我的算法就是靠它入门的。现在我还在二刷三刷。温故知新,可以为师...
我是看卡哥的动态规划入坑的,他的题解通俗易懂,关键还能举一反三且方法论的总结。点赞!!希望明年蓝桥杯能拿下省一!!哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈...
作为一名软工大二的学生,本学期开了算法设计与分析的这门专业课,但是老师讲解的是在是水,有种茶壶煮饺子的感觉,加上本身算法学习就较困难,以至于到现在还没有真正学习算法,直到在网上看到这本书,买了之后发现里边讲解贴合实际,语气话语接地气,能听懂能看懂,感谢这本...
作为一名软工大二的学生,本学期开了算法设计与分析的这门专业课,但是老师讲解的是在是水,有种茶壶煮饺子的感觉,加上本身算法学习就较困难,以至于到现在还没有真正学习算法,直到在网上看到这本书,买了之后发现里边讲解贴合实际,语气话语接地气,能听懂能看懂,感谢这本...
秋招初期跟着lc上的题刷下去 实在收获甚小,几十道下来不会的还是不会。一直想针对具体的题型深入的训练。后面偶然看到了代码随想录的视频和题解,跟着走完了背包九讲,不仅仅是背包问题还解决了很多其他的动规,讲的很形象,自己能构建出代码运行的过程,自己有了写算法的信息...
用户评价
我对技术书籍的评价往往很挑剔,尤其是算法类的书籍,因为它要求逻辑的严密性和阐述的清晰度达到极致。翻阅这本书的目录时,我注意到它对经典算法的覆盖非常全面,从基础的排序、搜索到图论、动态规划,几乎涵盖了面试和实际工作中会遇到的所有核心考点。更让我惊喜的是,它似乎不仅仅停留在算法的“是什么”和“怎么做”,而是深入探讨了算法背后的“为什么”——那种设计思想的演变和不同方案之间的权衡取舍。这种深层次的剖析,恰恰是检验一本算法书是否真正高水平的关键。我期待它能提供一些独到的视角,帮助我建立起一套稳固的算法思维框架,而不是仅仅停留在背诵模板的层面。如果内容真的能做到像宣传的那样深入浅出,那么它无疑将成为我书架上必备的工具书之一。
坦率地说,我是在朋友的强烈推荐下才决定购买这本书的。他是一个在顶尖科技公司工作的朋友,平时工作强度很大,但对这本书的评价极高,说它“拯救了我的面试季”。这种来自一线实践者的背书,对我来说比任何官方宣传都更有说服力。我关注到一个细节,书中似乎非常强调代码实现的可读性和工程化思维,这一点在很多学术性的算法书中是缺失的。一个好的算法不仅要高效,更要健壮、易于维护。我希望这本书能教会我如何写出“生产级”的算法代码,而不是那种只能在竞赛环境中跑通的“玩具代码”。如果它能提供不同语言间的对比或者性能分析,那绝对是超乎预期的加分项。我对这本书的期待值已经拉满了,希望它能带来真正的质变。
这本书的书名本身就透露着一种“陪伴式学习”的温暖感,这在冰冷的计算机科学领域中显得尤为珍贵。我过去学习算法时,最大的障碍就是那种孤独感——面对一个复杂的递归或动态规划问题时,找不到人商量,也找不到合适的“导师”。这本书的写作语气,据说是非常亲切且富有耐心的,这一点非常吸引我。我希望它能像一个耐心的老师,在我迷失方向时,用温和而坚定的力量把我拉回来。特别是对于那些对数学基础不够自信的读者,如果作者能用通俗易懂的语言解释背后的数学原理,那就太棒了。我期待的不是一本速成宝典,而是一本可以长期陪伴我,随着我的成长而不断焕发新意的学习伙伴。
这本书的封面设计简洁大气,那种深邃的蓝色调一下子就抓住了我的眼球,让人感觉这不是一本枯燥的技术手册,而是一次对知识的深度探索。我一直对算法和数据结构有很强的学习欲望,但市面上很多教材要么过于理论化,要么就是代码示例晦涩难懂,让我望而却步。然而,从这本书的介绍和目录来看,它似乎找到了一个绝佳的平衡点。作者的写作风格非常注重引导性,仿佛一位经验丰富的前辈在身边手把手地教你,而不是冷冰冰地陈述事实。我尤其欣赏它将复杂的概念分解成易于理解的小块,并且似乎还穿插了大量的实战案例,这对于我这种需要将理论应用于实际项目中的人来说,简直是福音。我已经迫不及待想翻开第一章,看看它如何用这种循序渐进的方式,带领我跨越学习算法的“死亡之谷”。这本书的装帧质量也很好,纸张厚实,印刷清晰,阅读体验无疑会非常舒适。
我是一位有着多年编程经验的开发者,主要工作是后端系统优化。虽然日常工作中不常直接编写复杂的“算法题”,但对底层逻辑的理解深度直接决定了系统性能的天花板。我购买这本书,更看重的是它在“思维拓展”方面的潜力。我希望通过它来磨砺我的逻辑推理能力,学习如何从更抽象的层面去思考问题、设计模型。很多时候,一个优秀的算法思想比一行优化的代码更有价值。我关注它是否能深入讲解算法设计范式,比如贪心策略的应用边界、分治法的精髓所在,以及如何识别一个问题适合哪种高级算法模型。如果它能提供足够的“思考题”和“变式分析”,让我能跳出书本上的标准例子,自己去解决一些现实中的瓶颈问题,那么这本书的价值就远远超出了其定价。
书写的很有趣,不枯燥,挺适合算法小白
【Others】散修24th.跟着刷了不少,最大的好处是总算在这搞懂了kmp(
由浅入深,在算法与数据结构中寻找规律,适合刷题,边看边刷,效果更好
随着卡尔哥刷算法已经一年多,期间虽然没有换工作,但在算法方面得到了很多提升,卡尔哥的新书必须支持!
由浅入深,在算法与数据结构中寻找规律,适合刷题,边看边刷,效果更好