算法入门 1: 推荐一个帮我两个月 AK 力扣周赛的算法仓库

580 阅读10分钟

这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

在两个月前,我也只是个算法零基础的小白,从 9 月初开始坚持刷力扣,中间参加了 11 场竞赛,终于在 11.14 号第一次成功的 AK 了周赛 🎉

虽然 AK 一次周赛对大佬来说是很轻松的事情,但对于我这个入门不久的小菜鸟来说已经是可以激动好几天了 😭

做完第三题只剩下半个小时,原本是准备溜了,看了眼第四题发现可以用并查集解,而前几天刚好就学了并查集,想着趁熟练度还在试试看,没想到居然通过了.

说实话第一次 AK 来的有点措不及防,之前预估至少要等到明年才能达成这个目标.感觉有点侥幸了,一个是题的难度可能不是很高,另外刚好最后一题考的算法前几天刚学过 😂

第 267 场周赛 第 267 场周赛

大家可以通过我的力扣主页XYShaoKang查证我的积分,当然目前还没有更新,周赛积分一般要等到周二以后才会更新,可以先关注一波,等更新了就能看到我的积分

我要推荐的这个仓库,里面就记录着我这历时两个月以来的刷题记录.我日常也都是用这个仓库配合 VSCode 的 LeetCode 插件进行刷题的,其中集成了一些帮助我提升刷题效率的工具.推荐有需要的同学可以了解一下.

废话少说,直接上链接 github.com/XYShaoKang/…

好吧,就是我平常自己用的仓库,不过不要在意这些细节🤣 ,有用就可以了

标题中的仓库已经推荐完了,那接下是另外一部分的内容"算法入门",我主要以力扣作为算法学习和练习的平台,所以这个系列的文章我也会以如何刷力扣为主线,介绍我入门算法的方法.

作为这个系列的第一篇文章,本篇文章会先讲一下刷力扣前要做的一些准备,然后再聊聊如何使用上面的仓库提升刷题效率.

虽然我是从前端的角度去刷力扣,但是算法的思想大多数跟具体的语言无关,所以除了部分具体前端的细节方面之外,其他方面的知识对于其他语言的使用者进行算法入门应该也会有帮助

题单

对于算法初学者,最容易遇到的一个问题就是不知道从何入手,力扣那么多题,该从哪儿开始刷?

力扣的题库中默认的排序是按照题目的编号,然后可以按照题解数,通过率,难易度,出现频率这几个维度排序,还可以通过标签去过滤.

力扣题库过滤选项

有的人可能按照难易度去刷,有的人可能按照出现频率去刷,这种按照单一维度去刷,不同题之间的知识点都是散的,题之间没有任何关联.我感觉按照标签结合难易度去刷是比较合适的,在同一个标签下,有一部分题是用同一个算法去解决的,这样在刷的过程中,可以不断的巩固之前用到的算法,可以避免像前面按照单一维度去刷的弊端.

不过即使按照同一个标签去刷,下面题的数量也还是太多了,不可能把一个标签全部给刷完,那如何去选择就尤为重要了,只是作为初学者,自己并没有办法从这茫茫题海中去进行这样的整理和选择,这时候就需要依靠伟大的互联网了.

其实网上有很多前辈发的题单(刷题路径),通过搜索很容易就能找到,然后多看几篇对比一下,找一篇自己感觉比较好的,按照题单去刷是最合适的.

至于如何去选择题单,我觉得比较核心的原则就是分门别类,比如大的方面分为数据结构和算法,然后细分下去数据结构分为数组,链表,树,哈希表等等,然后树还能往下分成二叉树,N 叉树等等,算法方面也一样,从最基础的递归,按搜索的顺序可以分为深度有线搜索和广度优先搜索等等,按照递归的特征可以分为贪心,分治,回溯再到动态规划等等,能找到分的越细的题单,刷起来也会越容易(当然还得保证准确性,这个需要靠多对比,以及自己开始刷一些题学一些基础之后,会有自己的分辨能力).

另外在同一细分里面,可能还会有一些系列题,这些题往往是从简单到困难一步步提高难度,我的经验是这种系列题刷起来会很舒服,有一个明显的提升的感觉,动态规划中就有很多这样的系列题,比如像股票系列,小偷系列,还有前几天 winter 老师写的 关于硬币的几个动态规划问题 等等.

也可以直接用我仓库中的刷题记录作为入门的刷题路径,前面几十题都是不同分类的题从简单慢慢到困难的,中间的话有一段时间在练习动态规划,所以那段时间就都是动态规划的题,之后找个时间按照分类整理一下.

我不建议在这上面花太多时间去研究,重要的是找到一个题单,然后刷起来.很多题单可能并不是很全,或者不一定是跟自己很契合的,其实都没有关系,题单只是起到一个引子的作用.

实际上刷题过程中,题单并不是一成不变的,我们会根据自己理解的加深,不断去更新题单.比如有些算法光是刷题单里面的题可能掌握不够熟练,这时候就需要额外补充这类算法的题去刷;有可能有些算法没有包含在题单中,或者是可以拆的更细的,这时候就可以去更新题单.可以在掌握了大多数基础的算法之后,通过刷每日一题或者周赛去发现自己对哪些题掌握的不够,从而作出调整.

当然只有题单的话,只知道要刷哪些题,而至于具体怎么刷呢?这是下篇文章的内容,我们会在下篇文章聊聊具体如何刷题的问题,这篇文章我们先把刷题之前的一些准备做好.

编程体验

在刷题的过程中,写代码应该是最核心的需求,毕竟刷题简单的讲只有两步:

  1. 把代码写出来
  2. 提交

在编程体验方面,虽然力扣网页版的编辑器跟其他的在线编辑器比起来体验上已经算是比较不错的了,但跟本地的 VSCode 比起来,还是差很多,如果能直接在 VSCode 里面解题提交测试,岂不美哉?

感谢力扣,出了 LeetCode 插件,让我们能直接在 VSCode 中进行这一系列操作.可以在不用离开 VSCode 的情况,完成编程,执行在线测试,以及最后提交代码,查看执行结果等等操作.

而这也为下面的功能提供了基础.

测试

除了写代码之外,测试应该是刷题时最频繁的一个操作了.测试可以帮我们提前发现一些问题,而在竞赛时每次提交错误都会有罚时,所以能提前解决问题尤为重要.不过力扣的在线测试,不能说慢,只能说不快.而即使是开了 VIP 的极速判题依旧不会快到哪里去(毕竟要通过网络这一来一回,另外我猜测可能测试机的性能会有限制).

而在 VSCode 中提交在线测试的话,还会有个麻烦的点,如果要提交自定义测试,就必须先手动拼好用例,然后粘贴到提交框,每次都需要,很是麻烦.

为了解决这个痛点,我在项目内搭建好了 Jest 的测试环境,直接在本地测试,以及配合 VSCode 的配置,能做到快速添加测试用例,快速开始测试.

通过快捷键添加测试用例

快速添加测试用例

通过快捷键开始测试

快速开始测试

其中更多实现的细节,大家可以查看仓库的使用指南

后记

有人可能会觉得,刷题主要是思考的过程,如果一个题有思路的话,不管在什么样的环境下都能做出来,这样追求效率有必要么?

确实我也觉得在解一个题的时候,能想到思路是最重要的,但有了思路之后,我们还需要实际对这个思路进行验证,有时候我们的思路并不一定正确,或者有某些边界条件没有考虑到,这就需要实际在代码中去验证我们的想法.而这个实现的过程,我认为一定是越快越好的,同样一道题的思路,在力扣网页端实现需要 5 分钟,而在 VSCode 上只需要 3 分钟,这就能省下两分钟时间.

当然平常刷题可能这几分钟并没什么大不了,但是在比赛的时候,就至关重要了,比如这次的周赛,完成的时间是 1:24:22,周赛的总时长是 1:30:00,仅省下不到 6 分钟,如果前面毎道题都多花个两分钟,那可能这次就答不完四题了.所以虽然实力上可能比不上别人,但是我们可以在别的地方去尽量弥补,场外做的准备不止有对算法思路的训练,对于如何快速编程的技巧,也需要多加训练,才能快人亿步,拿到更好的成绩.拿到更好的成绩能让我们知道自己走在对的路上,让我们更有动力去学习.

刷了两个月力扣,从原先的算法小白,现在感觉是入了个门.我记得之前看到过接雨水的题目,当时想了老半天,才堪堪写出朴素的解法,现在拿到这题的话,应该能在十分钟之内写出双指针的解法,这算是这段时间训练的成果了吧.

之前我感觉算法比的是智力,但现在我感觉基础的算法比的更多的是体力,就看有没有练过,如果没有练过可能大多数时候拿到题就是懵圈了,而练过的至少会有个基本思路,第一步朴素解法怎么解,更进一步怎么用空间去换时间,怎么去压缩状态等等.另外有些题的解法巧妙之极,但实际写出来可能很简单,就像脑筋急转弯一样,如果之前有遇到过,马上就知道答案是什么,而如果没遇到过,可能怎么想也想不出来.

对于基础的算法掌握,只是掌握怎么去用算法(对于前端来说应该是够用了),靠努力练习是完全可以做到的.至于更高阶的算法的话,我目前还不懂,如果我有幸能接触到的话,到时候在来聊聊.

好了,今天就聊到这,本篇文章讲了一些刷力扣前的准备,做好准备之后就可以开始去刷题了.

只是拿到一个题之后,如何去解,如何去学习呢?

下篇讲讲刷题过程中的一些问题,以及怎么解决.