navigation

帅张星球算法项目手册 1.0

帅张的球友们大家好,我是 labuladong。

简单介绍一下我自己,没记错的话,我应该是三期老球友了,自从 2018 关注张哥,受张哥的影响,开通了自己的公众号,诞生了 labuladong 这个昵称,之后就一直在算法这个领域持续输出,2020 年在 GitHub 开源了算法仓库 fucking-algorithm,没想到火遍了全网,一年过去了,现在这个仓库已经快有 100k star 了。

由于这个仓库的火爆,有很多出版社找来寻求出版,加上张哥的支持,我在去年年底出版了纸质书《labuladong 的算法小抄》,销量一直非常稳定。为了回馈张哥一直以来的指导和帮助和球友给予的鼓励和支持,我给张哥的球友整理了这一份算法手册。

张哥球友里有很多学生和技术人,众所周知现在技术岗面试内卷严重,算法基本上是必考项目了,我知道很多人对算法并不是真爱,所以被算法搞得很头痛。

我也是这样过来的,但靠着自己的努力和一些技巧,在毕业秋招斩获了 13 个 offer,基本上你随便说一个大厂,我都拿到了 offer。

说这些,不是凡尔赛,说实话刷个题面个试真的不算啥,比这难的事情多着呢,毕竟张哥星球里卧虎藏龙。

我想说的是,其实刷题也好,面试也好,都是有技巧的,我希望把我的技巧和经验分享给大家。如果你有刷算法题的需求,我可以提供一些捷径,避免你走太多弯路。

学习算法可能遇到的问题

1、题太多,不知道从哪里开始刷

现在 LeetCode 已经 2000 多道题目了,难道我要全部刷完,才算搞定算法了吗?

我应该怎么刷题?按题号一道道刷?按分类刷?听说动态规划相关的问题经常出现,干脆直接开始刷动态规划问题?

2、没有人指导,刷一道题就仅仅是刷了一道题而已,很难举一反三

这是很多朋友都存在的问题,尤其是在刚开始刷题的时候,很难在做完一道题后总结出一些通用的技巧,在遇到新的问题时运用出来,所以很多读者调侃自己「一看都会,一做就废」。

不需要气馁,在刚刚刷题的过程中,积累的算法技巧有限,难以举一反三很正常。但如果有人能够给一些思路上的引导,会让你学习算法的效率事半功倍。

3、被有意无意地灌输错误的思想,以为算法很高大上,非要啃完算法导论才算是入门,所以从心理上就畏惧算法

我对这个问题有切身体会,刚学算法那会儿,我会去搜索过各种资料、经验贴之类的,想快速入门。

现在回头在看,就觉得很有意思,我是说很多写经验贴的作者心态很有意思。

举个例子,很多「大佬」,你问他怎么入门算法,他告诉你看《算法导论》,然后又甩给你一堆英文课程,还强调一定要看英文的哦,中文的翻译不好。

这就好比,你是一个胖子,去问人家怎么减肥,人家告诉对方,每次做 100 个俯卧撑,100 个引体向上,一天三次,肯定有效,你看我就是这样练出来的!

你仔细琢磨琢磨,给出这种回答是基于一种什么心理?

实际上他根本不在乎你的诉求,他只是想告诉你:我做过这些,我吃过这些苦,我牛逼吧,我厉害吧,你羡慕吧,你做不到吧~

不过话说回来,这种小九九人皆有之,我也不例外,我也时不时想证明自己牛,想证明自己和别人不一样,我以前做分享,也会多少有点故弄玄虚的倾向。

但后来我发现,真正帮助别人解决问题,是更能得到对方的认可的,这也是我的公众号能够很快成长的原因。

所以大家可以放心,这份教程是「老少皆宜」,非常接地气的,最能解决学习算法这个问题的。

都说算法难,到底难在哪里

1、技巧较多,难以整活儿

各种算法技巧确实比较繁杂,初学者很容易碰到没见过的技巧,碰到时就打呼牛逼,觉得自己菜。比如说判断一个单链表是否成环的算法,一般人确实很难想到。

这也是为什么我说一开始刷算法题不要死磕,因为技巧储备还不够。

比如现在出一道数组的题目,你的脑海里能浮现出什么算法技巧?最起码应该想到 二分查找快慢指针左右指针滑动窗口前缀和数组差分数组

这些技巧就好比武器库里各种型号的武器,你得有的选,才能运用出来不是吗?那么对于初学者,武器库里面就没什么东西,拿什么死磕?拿步枪去打坦克,这不扯淡呢吗?

那么如何解决技巧储备不足的问题呢?这就是我想解决的问题,我把所有常用的算法技巧都集合起来,给你整理出一份「速记手册」,就可以帮你在做题的过程中有一个方向性的指导。

下次遇到数组相关的题目时,你把我总结的数组相关的技巧都拿出来,一个个试,形成一套固定的做题方法,那遇到新的算法题,不就来者不拒了吗?

2、对于递归的理解不透彻

递归思维是经典的计算机思维,如果掌握不好,很多时候你去看别人的题解代码可能都看不懂,这就很打击人的自信,觉得自己好菜。

不用气馁,递归确实不好理解,因为它是「计算机思维」嘛,你是个人,又不是个计算机,当然不容易理解了。

要掌握递归,关键要跳出细节,培养框架思维,尝试从整体上理解算法的过程。

以我的刷题经验,初学者最好从「树」相关的问题开始刷题。我会讲解很多二叉树的题目,帮助大家培养框架思维,别不信,到后面你会发现递归代码反而是最简单,最容易理解的。

你能在这里学到什么

首先,我会结合自己的刷题经验,有所取舍,忽略性价比不高的算法技巧,帮助大家高效刷题,迅速掌握算法,搞定面试笔试。

其次,我希望帮助大家培养框架思维以及举一反三的能力,力求让大家真正爱上算法,每天不刷两道题都难受的那种。

本站内容分两大部分,第一部分是递归思维的训练,主要是讲透二叉树相关的问题;之后的部分是算法技巧的速查手册,包括动态规划、回溯算法、数组、链表等等多种常见题型可能用到的解题套路

不管你是刚刚入门算法的小白,还是对算法有所小成,希望进阶,我相信这些内容都会对你有帮助。