「回忆 2022,展望 2023,我正在参与2022 年终总结征文大赛活动」

力扣主页 leetcode.cn/u/xyshaokan… 欢迎沟通

别的求个杭州前端的工作时机,React 技能栈,项意图话有一个自己独立开发的 Chrome 扩展 github.com/XYShaoKang/…

力扣 2700 分总结 & 算法学习入门指南

算法学习历程

以下是我学习算法进程中一些比较重要的节点:

  1. 2021 年
    1. 09 月份开端继续刷题
    2. 10.03 开端打周赛
    3. 11.14 第 267 场周赛第一次 AK 竞赛
    4. 12.26 第 273 场周赛第2次 AK 竞赛,而且拿到 Knight 勋章
  2. 2022 年 05.22 拿到 Guardian 勋章

我把我整个算法学习进程分为三个阶段:

  1. 第一个阶段:学习根底算法的阶段。这个阶段大约花了两个多月,其实其时仅仅完结了部分的根底算法学习,像根底的图论、数论的常识我是在比较后边的时分才补上的。
  2. 第二个阶段:想办法能够快速处理周赛前三题。首要是经过模仿周赛和随机刷题,然后在这个阶段会组织每周去学习一个进阶的常识点。这个阶段花了两个月左右的时刻。
  3. 第三个阶段:为了操练思想才能、打破第四题,然后是补充像数论、图论之类的根底常识,以及算法的证明等等,操练则首要是去 Codeforces 上刷构造题。这阶段就继续了比较久的时刻了,大约继续了近五个月的时刻,一方面是我自身根底不太好,需求补的东西比较多,别的一方面中心也走了一些弯路,去学了一些比较偏的算法浪费了一些时刻的。
  4. 后边直到现在,尽管也刷了挺多题的,一方面其间有许多水题,别的一方面要到下一个阶段,我现在的常识储备还差的挺多的,加上最近两个月也没有太多时刻放在算法上,便是做做每日一题,打打周赛,所以一向没有什么本质上的打破。

在整个算法学习的进程中,第一个阶段是我感觉最充分的一段时光,差不多是开端的两个月内,每天都能学到新的常识、有所收成,一两天就能把握一个常识点,每天能够显着感觉到自己的进步,这也是开端的那段时刻里边让我坚持学习的首要动力。

后来就很难能够在短时刻内频繁的感觉到提高了。关于进阶的常识点,每个常识点把握周期往往是以周为单位,乃至更长;而关于才能的操练,也往往是需求长时刻刷题的堆集之后,才能实在感觉到提高。在这些时刻里边,最首要能够影响我前行的动力,一方面来源于能够独立处理题意图成就感,特别是处理那种对自己来说有点难的,但凭着自己一点点去剖析、优化终究能够 AC 掉,那一瞬间感觉是真的很有成就感。另一方面则是来源于周赛,每次参与周赛总是有一种热血沸腾的感觉,以及 AK 时那种影响的感觉,每当我不想刷题的时分,我就会去想想这种感觉,就能让自己多刷几题。

在完结第三个阶段后,我感觉自己才实在进入的算法国际的大门。之前许多标题都是凭感觉、凭经历去解答,而现在能实在去剖析标题,挑选适宜的算法,而且有才能去证明为什么用这种算法是正确的。

当然首要是一些简略中等的题,难的题许多时分也仍是要靠经历去猜。别的竞赛的时分,根本上也是大致想一下这样做是对的,不会特别严谨的去证明,一般是在 AK 之后,再去想比较严谨的证明。

算法入门

假如你现在还没有任何方向,比较苍茫,不知道怎么开端去学习算法,那么能够以此作为一个攻略,这也是这篇文章的首要意图,将我学习实践的进程,总结成卓有成效的一套方案,期望能够协助你少走一些弯路,更简略的入门。

假如你现已有在学习某个算法课程,那么主张以你正在学的课程为主。或许你有教师在带你的话,也主张以你教师的规划为主。当然你能够以这篇文章作为参阅和对照,或许能够反映呈现有的规划中的一些不足之处,那这篇文章对你来说也会有所价值了。

这儿的入门,首要是指周赛 1800 分以下的阶段,当分数打到 1800~2000 的话,至少是大约率能够安稳而且比较快速的 AC 前三题了,这个时分关于根底算法的把握现已适当不错了。而从 2000 往上就开端慢慢往进阶阶段去走了,这时分需求依赖于对第四题的打破。

关于进阶的部分,我涉猎的也不多,只能供给一些我自己经历,能够参阅后边进阶部分的内容,期望能帮到你。

每个人详细遇到的状况或许会有所不同,有或许有些状况我没有遇到。假如有任何问题或许疑惑,欢迎经过评论或许私信进行沟通~~

条件

每个人或许都有自己的偏好和方针,或许有的人学习算法,是为了享用这个进程中自己去创造一些算法的乐趣;有的人是为了能够享用从文献中去追根究底的乐趣;有的人仅仅当作兴趣爱好,作为空闲之余的业余活动等等,我觉得自身并没有对错之分,只需能够到达自己想要的意图即可。

而我的意图其实很简略,便是为了高效的提高算法才能,后续内容也都是以此为条件进行的。

比方看题解这件工作,我觉得彻底是没问题和没有任何心理担负的,只需符合其时的方针即可。比方在根底算法的学习中,自身就有十分多的常识是咱们不会的,这时分咱们的意图是为了能够去学习这些常识点,在进行一些时刻的考虑之后没有思路的话,去看题解是彻底没有问题。当然不是看完题解就完事了,咱们需求从题解中去获取反响,从中剖析出咱们究竟是由于什么问题导致没有思路,然后去处理它,然后协助咱们提高自己,这正是学习的意图。

别的以下内容针对的是算法零根底,而不是编程零根底。我觉得至少把握了一门言语的编程根底,再去学习算法会比较适宜。其实也不需求十分精通,对根本语法、判别循环、字符串、数组、函数等有一些根本的认知和实践即可。即便彻底没有编程经历,一般来说花个一个礼拜去学一下应该都能到达的程度。

学习的核心

学习的进程,便是不断重复的进程。

关于学习算法来说,一个最根本的思路,便是去找到自己不会的常识点,经过学习去学会它;找到那些不娴熟的操作,经过刻意操练,去构成肌肉回忆;关于不熟悉的思想套路,找到相似的题,去多做几回,不断去熟悉直到把握这个套路。总结起来便是找到一个弱点,经过学习或不断的操练,直到战胜这个弱点为止,然后不断重复这个进程。

战胜苦楚

在整个学习的进程需求不断战胜自己的慵懒、拒绝其他的诱惑、强迫自己集中精神去考虑等等,肯定是不会太舒畅的,大多数时分都是苦楚的。

但在这个进程中,咱们能够经过去抓住一些其他的情绪,去掩盖或许忘掉苦楚的感觉。

在最开端的时分,我首要是以好奇心作为动力来驱动自己去学习,学到新常识的愉悦的感觉往往会比这个进程中苦楚的感觉要强烈许多。而每次能自己独立做出题时的成就感也是十分强烈的,体会往后,往往期望能够再次体会到这种感觉,这也是我学习和操练的动力之一。参与周赛带来的反响,假如那一周考的好了,就会十分高兴,然后有动力继续刷题;假如是考的欠好,则会很沮丧,这时分就会想着下次必定要考好,也会有动力去刷题。

这儿我仅仅供给一些参阅,每个人的体会或许都会不同,比方像我这样会对上分或许掉分感到比较强烈的情绪,则能够加以利用,或许有些人对周赛成绩不是有很大牵动,则不会有这种感觉。所以需求依据自己实际的体会,找到能够利用的点,将其转化为对自己有利的决议方案。

学习思路

正确的学习思路是要依据不同的才能,去运用不同的办法去把握(以下描述将常识点也统称为才能的一种)。我觉得算法才能并不是单一的某种才能,而是多方面才能的归纳体现。包含数学、算法等理论常识;还有思想、逻辑等比较笼统的才能;以及编码、调试等实际操作的技巧。

其间不同的才能,需求不同的办法去学习和把握,比方关于常识点,需求先去学习对应的思路,然后经过操练到达把握的程度;而关于像思想才能这样比较笼统的才能,则需求经过许多的刷题来进行操练,相对的学习常识点的成分占比较少。

而且有些才能之间会有先后之分,比方某些比较难的常识会以某些比较根底的常识作为根底,那么先学根底的常识再去学难的常识是一个比较合理的次序。

学习结构

关于不同的才能,是需求用不同的学习办法去把握的,但在全体上,有一个大的结构是能够重复运用的:

  1. 拟定方针和方案
  2. 经过学习和操练完结方案
  3. 经过某种测验获取反响
  4. 依据反响判别是否到达方针,假如现已完结方针则开端下一个才能的学习,不然去剖析哪些当地没有到达方针,然后调整方案,直到到达方针
  5. 过一段时刻回头来温习

其间第二点关于不同的才能或许会不同,有些才能需求拟定学习和操练的方案,而有些才能或许只需求进行操练的方案。而第五点,则首要是针对常识型的才能,以及一些不太常用的技巧之类的。

这个结构我们应该是十分熟悉的,其实咱们从小到大的学习,都是用的这一套结构,仅仅其间许多部分是由教师这个人物去完结的,而咱们只需跟着学、完结操练、去考试就能够。但学算法的话,大多数状况是没有教师这个人物存在的,咱们需求自己去完结那些原本是由教师来完结的工作,比方去定方针、依据不同的内容拟定不同的学习方案、给自己组织测验、自动去获取反响等等。

以下是依据我自己学习进程中,依据自己的状况进行剖析得出的成果,并不必定适合每个人,或许你的状况跟我相似,能够参阅借鉴。或许你会遇到不同的状况,那就需求依据自己详细的状况去剖析。

根底阶段

  1. 坚持决心
  2. 主线由易到难
  3. 关于每个常识点:先学习,在实践,最终测验反响
    1. 高效的学习
    2. 重复操练
    3. 自动寻求反响

坚持决心

我觉得关于初期的学习来说,坚持学习的决心是十分重要的。

假如你感觉自己一向学不会算法,花了很长时刻也没有多少提高,那么十分有或许仅仅由于学习办法不对罢了。正确的学习办法,会让初学者以简略形式的局面,而过错的学习办法,则有或许让初学者以地狱形式局面。以地域形式局面,有或许长时刻无法获取正向反响,然后十分简略发生自我怀疑,觉得自己是不是没有这方面的天分,不适合学习算法,然后导致被劝退。

我最初也是被过错的学习办法劝退了好几回,当我把握了正确的学习办法之后,才发现其实并不是自己天分不行或许是太笨了,而仅仅是由于用错办法罢了。

别的关于天分的考虑,我觉得至少力扣 2000 分以下,应该都不存在天分的问题,差异仅仅天分好的同学或许两三个月就能打上来,而咱这样天分一般的,或许需求花个大半年的时刻,但至少这不是一个彻底不可达的方针,彻底是能够靠勤奋弥补上来的,仅仅看是否愿意投入时刻罢了。其实 2200 分我觉得也彻底不存在天分问题,仅仅需求正确的操练和更多时刻。当然这儿都是指用正确的学习办法,假如是用了过错的学习办法,掉到某个大坑走了弯路,有或许会被浪费许多时刻。

学习办法

学习的进程有许多时分是苦楚的,而一个好的学习办法或许不会降低学习的苦楚,但至少不会添加学习的苦楚

我觉得关于初学者来说,首要的方针是要把握根底的算法常识点,咱们在解题的时分,假如一个标题要求的常识点都没有把握,那么大约率这题是做不出来的。把握对应的常识点,是能解出一题的根底,所以这也是初学者首要需求去学习和把握的。而要把握一个算法常识点,除了要把握其对应的思想,还要把握其完结,究竟咱们终究需求能让程序运转起来才行。

为了完结这个方针,引荐运用以下的办法去学习,这也是我平常在学习算法常识点时用的办法。

  1. 「全体上的规划」

将根底算法的常识点依照算法的难度、进阶、组合等联系有层次、有规划的进行学习。

当咱们踏入一个生疏的领域的时分,会有十分多不会的常识点。咱们尽管能一起做许多工作,但学习的话,专注于一点去学习往往能取得更好的作用。从这点来说,咱们是单线程学习的,那么关于这么多不同的常识点,咱们就需求有一个先后次序。这也是为什么咱们需求有方案的进行学习。

我觉得一个比较好的学习次序,先去学一些简略的、作为底层根底的常识,然后在此之上去学习一些略微难一些的、或许是现已学会的根底上扩展的常识,这样一点点去学习是最好。

关于详细的学习次序,关于初学者来说自己去规划仍是具有必定困难的,能够参阅后边我给出的几个参阅链接,或许经过搜索引擎自行搜索。

  1. 针对「每个详细的算法常识点」

首要去学习算法的理论常识以及完结。然后去刷该算法对应的模板题,而且要重复多刷几遍,经过这个进程,能够到达两方面的意图:一方面能够查验自己关于算法的了解是否正确,有过错的当地需求及时改正;另一方面完结对算法完结的根本把握。最终去刷这个算法对应的扩展题,这个进程首要是提高关于该算法把握的娴熟度。完结这一套流程之后,能到达的作用是,给定一个该算法的标题,根本上就能解出来。

  1. 针对「每一道标题」

能够略微花一点时刻看看有没有思路,即便是朴素的解法也没联系,能够先写出来,然后再一点点去优化。给自己设定一个时刻(比方 20 分钟),这个时刻内都没有任何思路的话,主张直接去看题解。一般这种状况下,要么是解这题的某个常识点没把握,要么是需求某种特殊的考虑角度之类的,继续想下去也不大或许想的出来,就没必要再继续浪费时刻了。经过看题解去剖析自己详细是由于什么原因解不出来的:假如是由于某个常识点没有把握的,那么去学会它;假如是由于有些当地了解不对,那么重新去梳理一下;假如是由于某个思路没想到,那么记住这这个思路。当然假如看到题解中的一些信息,发现自己有了思路了,也能够停止继续看题解,依照自己的思路再去试试看,但是主张这个进程仍是不要花太多时刻。这个阶段要承认咱们是有许多东西不会的,需求去学的,许多东西光靠自己想是想不明白的,或许即便能想明白,也需求花费许多的时刻,不如直接去学来的快。这也是保证学习功率之一,而学习的功率则能保证自己能够在规则的时刻内完结方针,然后保证自己学习的决心。

当然不是看完题解之后,这题就这么过去了,需求在了解题解的思路后,自己能够在不看题解的状况下,依据思路独立写出来。别的关于这种看题解才写出来的标题,一般需求要点符号一下,过几天回来重新做一遍。由于是看题解之后,才有的思路,很或许仅仅其时记住了,很简略过一段时刻就忘了,这种就十分需求靠温习来稳固的。

  1. 方针

关于模板题的要求是练到肌肉回忆,也便是当你下次看到这题时,能够不加思索的写出来,这是算法的根本功。像周赛前排的大佬,常常能用极短的时刻作出周赛四道题,便是由于经过许多的操练,把算法操练到肌肉回忆的程度,根本上看完标题,就能想到用什么算法,然后很快把算法完结出来。

而关于扩展题的要求是,能够独立完结出来。当然关于进程来说不论你是经过自己想出来的,仍是说看题解之后才想到的都没联系,这个时分能做到前面对应的要求独立完结出来,就算完结其时阶段的方针,既把握这个算法常识点。

  1. 扩展

这个学习进程,是一个按部就班、由易到难的进程,尽量减小学习进程中所要跨越的高度,使得学习曲线愈加滑润。

别的引荐看一下覃超讲的《怎么高效学习数据结构与算法》和《怎么用好 LeetCode》,其间会有更多细节。我最开端也是经过这个视频,才了解怎么正确的去学习算法。我学习算法的实践进程中,也都是以视频中讲的办法为根底去扩展开来的。

关于计时,假如每次刷题需求自己刷动去开启计时会略显麻烦,这儿引荐一下我开发的浏览器扩展Refined LeetCode,其间有一个计时功用,会在每次翻开答题页的时分,自动开端计时,当提交成功之后自动将耗时记录到补白中,整个进程不需求手动操作,十分方便。扩展还有一些其他功用,详细详情能够查看帖子 力扣浏览器扩展 Refined LeetCode 介绍。

过错的学习办法

举一个过错的学习办法的例子,最初我也是掉到这个坑里边,被劝退了好几回。

有一种十分坑但十分常见的办法,便是让人直接去刷题,这种办法就会让初学者以地域形式局面。这种办法的学习功率十分低,除非天分较高,而且有必定的根底(包含编程根底、数学根底、算法理论根底等等),才比较有或许用这种形式局面,而且能坚持下去的,不然大约率会被劝退。

这儿仅仅针对初学者来说,在学习算法的进程中,有些阶段需求去许多的刷题,从刷题的进程中去获取反响。比方在学会大多数根底算法之后,需求提高前三题的解题速度,这时分就需求经过许多刷题去才智不同的题型;或许是要提高思想才能的时分,需求经过许多的刷题去操练等等。

获取反响

在学习的进程中,获取即时反响是十分重要的。反响分为自动型反响和被迫型反响,自动型反响便是依据自己自动去获取反响,而被迫型反响,则是他人给你的反响,比方读书的时分教师给咱们批改作业,告知咱们哪里错了。在算法学习进程中,被迫型反响是比较少的,大多数时分算法都是靠自学,很难找到他人给咱们做代码检查,即便身边有这样一个人,也不或许一一去看咱们写的每一段代码,相关于咱们刷的题来说,占比也是比较少的一部分。

当然假如你身边有能够帮你检查的人物,那真的是十分走运,特别是关于根底阶段来说能这样直接获取的被迫型反响是比较难得的。

还有别的一种办法能够去获取这样的反响,那便是写题解,把题解发布出来,比方力扣的题解区,去接受其他人的检查。当然这种办法的缺陷便是或许反响会来的比较慢,但不失为一种补充。

除此之外大多数时分,是需求咱们去自动寻求反响的,比方:

  • 关于每一题,咱们经过提交去获取反响,验证咱们的解法是不是正确的
  • 提交成功之后,咱们能够到提交详情页以及题解区中去查看他人的代码获取反响,看看自己的完结是不是有哪些能够改善的当地
  • 关于每一个方案,咱们需求经过独立去完结扩展题获取反响,以验证自己是否完结了学习的方针。
  • 关于每个阶段,咱们需求经过反响去了解自己其时的算法水平

怎么判别自己其时的算法水平

要了解这个信息,我觉得是比较难的,许多时分咱们关于自己处于一个什么水平是比较糢糊的,更甭说让他人来判别自己的水平。

关于根底阶段来说,衡量一个人的算法水平,首要看的是把握了多少算法常识点。所以我觉得根底阶段,核算把握了多少算法常识点是一个比较不错的衡量标准。你能够把一切的根底算法常识点列出来,然后一个个依据自己把握的程度去判别,最终看看有多少是自己实在把握的,有多少是自己还没有把握的。

判别一个常识点是不是现已把握了,一个是能够看自己的感觉,当然假如有时分感觉不准的话,其实能够经过去找一个这个常识点的扩展题来做一下,看看能不能做出来,最好是之前没做过的。

别的我觉得周赛的分数是对一个人的算法水平比较精确的体现,至少 2400 分以下仍是比较精确的,我一向以来也是以周赛作为一个参阅,去拟定后续的方针和方案。

当然要经过周赛去反映自己其时的水平,或许需求继续参与一段时刻的周赛才行,这样得出的成果才会比较精确。假如只打一两场的话,很有或许正好遇到比较难的,这样或许并不能正确的反响自己其时的水平。不过除了正常参与周赛以外,还能够经过模仿周赛,多打几场,看看自己的排名大约是多少,然后看看那个排名的邻近的分数大约是多少,也能够用来作为参阅。

进阶阶段

我首要是以周赛作为自己的反响,去衡量自己的水平,以此来拟定后续的方案。全体是以怎么 AK 周赛作为方针。我现在的水平大多数时分能做出第四题,但偶然或许遇到一些比较难的或许状况欠好的话,也是有或许写不出来。

要 AK 周赛,其实步骤也简略,便是快速写完前三题,然后把第四题写出来。仅仅要到达这样的作用,则没有那么简略,需求花时刻去不断的学习和操练。

快速完结前三题

我经过前面的办法完结根底阶段的学习之后,能到达的作用是:假如我能想到一个标题所用的算法,那么大约率我能解出这题,但假如想不出来的话,那根本上就解不出来的。这时分在周赛的体现两题三题都有或许,十分看其时的状况,是不是能够看出对应标题所用的算法。

这个时分我的瓶颈首要在怎么看出一题所用的算法,这个时分有两种办法能够进行提高,第一种办法是实在提高自己的思想剖析才能,第二种办法则是经过刷题量去才智大多数的题型。

我其时没有了解到第一种办法,所以挑选的第二种办法。第二种办法相关于第一种办法来说,需求学习的东西比较少,彻底靠刷题去练就好了,而且操练的难度也会比较低,经过模仿周赛的办法去练前三题。别的能够参阅零神开发的 问题评分项目,去找到跟自己其时分数差不多,或许高一些的标题,去刷这些标题比较有利于提高。

这样练个一个月左右,大约能堆集一百多题的刷题量,这时分周赛大约率能够稳三题了,但假如要快速三题的话,或许还需求继续去操练。

而关于上面提到的第一种办法,我也是在比较后边的时分才去把握这种办法。操作起来会愈加难一些,首要或许需求依据自己的根底,去补许多常识,包含数论、图论等常识,还有许多题意图证明等等。之前咱们都没有说要十分严谨的去证明咱们所学的算法,大多数时分凭感觉也能做出许多算法题,但假如要实在把握剖析题意图才能,则需求学会怎么去证明才行,学习证明一方面是能保证自己算法的正确性,别的一方面也是在操练自己的思想才能。除了需求学的常识,别的也需求对应的操练。操练的话能够像上面那样去找到跟自己其时水平差不多的标题,或许是略微难一些的标题。

打破第四题

当咱们能够快速处理前三题的时分,就能够想办法去打破第四题了。当然也能够在进行前三题操练的一起,去学习一些进阶的常识点。这个需求依据自己的实际状况去拟定方案。

关于第四题来说,首要需求像两方面去打破,一个是进阶的常识点,一个是思想才能。

常识点的挑选,能够参阅这个帖子周赛第四题小统计 的办法,去统计之前周赛调查的常识点,去一个个学习,这样会愈加高效一些。当然周赛第四题的常识点并没有限定在某一个范围内,假如某一周出了之前都没考过的考点,也彻底不奇怪。

详细每一个常识点能够沿用之前的学习办法,仅仅相对来说进阶的常识点会更难一些,学习的时刻会更长,而且要到达娴熟把握,往往操练的量也会更多。

至于思想才能,其实上一节的第一种办法,便是在操练自己的思想才能,别的能够参阅灵神的共享。

想要打破第四题的话,要做好心理准备,这个进程通常会继续比较长的时刻。我能大约率解出第四题应该是从本年 5 月份开端的,从我开端去学习进阶的常识点算起,也便是我第一次 AK 的那一周,大约花了半年多的时刻,去掉一些操练前三题的时刻,以及走了一些弯路,至少三四个月是要有的。

然后这个进程中关于第四题的心态,我觉得能够不必过度强求,这注定是一个漫长的进程。学完一个常识点之后,有或许是好几周以后才会用到,咱们能做的便是尽量去扩大自己把握的常识点的范围,然后添加自己处理第四题的概率,需求等候突变引起突变的那一天。当然每次周赛的复盘仍是要的,比方有些标题确实在自己的才能范围内,但却没有 AK 掉,就需求去剖析详细的原因,然后处理它,争夺下一次不会在这上面犯错。

就像灵神视频里说的,假如不是天才型选手,那只能靠吃苦操练去提高自己,以每一千题作为一个阶段,以 1000、2000、3000 题作为方针去尽力。

这儿的标题数量首要是指对自己提高有协助的题,不论是简略题仍是困难题都没联系,只需能帮自己提高。比方学习算法时刷的模板题、提高对应算法娴熟度时刷的题、检测出自己不会某个常识点时刷的题、温习时刷的题等等。咱们需求对哪些刷题是对自己实在有提高要心里有数。当然许多时分在刷题之前,咱们并不知道刷这一题是否对自己有提高。这儿就要说到上面引荐的标题挑选,去刷跟自己其时水平差不多,或许更高一些的标题,刷这样的标题大约率是能够对自己有提高的,要么是能够补上自己的某个常识缝隙,或许是对自己的思想操练有必定的提高。

是否用 JS 刷题的主张

假如是只计划在力扣内刷题的话,我觉得用 JS 是挺不错的,相对来说力扣对 JS 是十分友爱的,但假如有计划去其他途径刷题的话,或许 JS 就不是一个很好的挑选了,那时分需求处理十分多的极点边界问题,比方关于数字来说,许多题意图数字范围需求处理 64 位的状况,这在 JS 里边是比较丧命的,由于 JS 中的 Number 类型大于 53 位后就不精确了,要保证精确就需求用 BigInt 类型,但 BigInt 类型的功率十分慢,有些标题 C++ 用 double 能过的题,JS 用 BigInt 就会超时,所以有些题用 JS 是过不了,这就让人十分抑郁了;还有的算法需求用到递归,而 JS 中的递归深度是十分小的,许多 C++ 直接写递归能过,但 JS 就会爆栈,需求用栈去手动模仿递归,但手动模仿会有必定的功率丢失,有些比较极点的题,就会造成超时。力扣中就十分友爱的把 JS 的调用栈深度调大了,而其他途径则没有对 JS 进行特别的优待。像这样极点边界的问题还有许多,实际上不止 JS,其他言语也会有些极点边界问题需求处理,但像 C++ 这样正统竞赛的言语,由于刷题者比较多,许多问题会有现成的处理方案。但是进阶的标题顶用 JS 刷的人会少许多,遇到这类问题的时分,就需求自己去想处理方案,一一测验,这是十分耗时刻的,我记得花的最长时刻的一题耗时 4 天,一共提交了一百多次最终才经过。

所以假如是之后计划要往进阶方向去学习的,主张运用 C++ 这种正统竞赛的言语,能够省去许多无谓的时刻。当然假如对错要用 JS,也是能够的,便是不要跟我相同头铁,放过一些极点的标题就好。现在来说我遇到的标题里,只有一题没有过掉,其他多花点时刻去折腾都能用 JS 过掉(或许是我还没遇到实在难的),有些仅仅略微超出一点时刻的标题,多提交几回,也能擦着边过掉。

感谢 & 引荐

首要需求感谢有力扣这个途径,友爱的界面、即时反响、优质的题解区和讨论区,是一个初学者进行操练的绝佳之地。不需求处理输入输出、支持大多数言语、能给出完好的过错样例等等特点,也十分有利初学者专注于算法学习这件事自身,而不必涣散精力去处理其他一些细节的东西。

别的十分感谢覃超教师,假如最初没有看到《算法面试通关 40 讲》这门课程,或许还一向还在用着过错的办法去学习,然后浪费时刻。正是从这门课程中,让我学会怎么正确的去学习算法,带我顺利的跨入算法学习的大门。所以我十分引荐这门课程,能够在哔哩哔哩和极客时刻上看到,前面几节免费试看,其间就详细讲解了怎么正确的去学习算法。

引荐一下 y 总的《算法根底课》,这门课程十分系统的讲解了根底算法相关的常识,其间关于每种算法的证明,帮我在提高逻辑剖析才能的时分起到了十分重要的作用。

在学习的时分,全体方向上是跟着课程走的,但每个详细的末节,则需求依据其时的状况去判别,自己不是真的把握了对应的内容,假如没有实在把握的状况下,不要着急去学下一节,要把这一节的内容吃透在往下走。假如是哪里没有了解透,就去找对应的资料,不论是视频、博客、或许跟他人讨教都能够,只需能搞懂即可。或许是不行娴熟,则能够多给自己找一些扩展题去操练,而不仅限于课程中给出的操练题。

以上是我学习的进程中看过我觉得十分好的而且其对我的学习起到巨大协助的课程,引荐给我们有需求的话,能够看一看。

当然算法学习并不仅仅仅仅看课程,还需求靠自己不断的学习和操练,有许多常识和技巧是课程里边没有供给的,这时分就需求靠其他途径进行获取和学习,其间一个很重要的途径便是力扣的题解、以及评论区。引荐以下几位,是对我的算法学习进程中协助比较大的大佬:

  • 灵茶山艾府 经过灵神的共享,我找到了进阶比较要害的办法。而且灵神的题解和每周周赛的讲解让我收成巨大。我们能够重视下 B 站的 「灵茶山艾府」
  • zerotrac 看了零神许多题解,收获颇丰。而且在群里跟零神的一次沟通中,纠正了我对时刻复杂度的一些过错认知,对我起到了很大的协助。尽管零神说大约率不会再更新算法相关的视频了,不过能够看看零神之前打竞赛的实况。B 站的 「zerotrac」
  • hqztrue 从蛙佬的题解中学到了许多常识,尽管有许多题解以我现在的水平还看不明白 。

别的在灵神的群里看许多大佬讨论算法,也让我获益良多。以及力扣上许多大佬的评论和题解让我受益,在此一并谢过。

引荐几个 B 站的 UP 主:

  • 哔哩 winter 前端方向的小伙伴能够重视一下,我最开端学算法的念头,便是听了 winter 教师的公开课发生的。
  • 我是小蜗蜗 我的线段树根底便是从沃教师这儿学的。

  • 常识点学习次序参阅
    • 根底算法学习路线 假如没有自己的学习次序,依照这个图里边的次序去刷也是不错的
    • XCPC 常识树 这儿边罗列的常识点比较全,而且依照难易度进行区别,能够用来对照自己其时的状况,看看有没有哪些常识点是没有把握的。
    • 或许能够参阅下面课程的目录
      • 极客时刻 算法面试通关 40 讲
      • Ac_Wing 算法根底课