讨论/技术交流/大家都是如何刷 LeetCode 的?/
大家都是如何刷 LeetCode 的?

分享你的学习经验和成长窍门

5
共 22 个回复

本人非计算机专业,接近 30 高龄才开始学习算法和数据结构,下面几个方法,想必大家也听过,因为我确实是通过这些方法得益的。以下文字仅供参考,请大家指点。

看 “答案”,明目张胆学习别人的智慧

看 “答案” 的前提是自己先做一下,自己要有思考。实在没有思路的话,我认为看答案也无可厚非,我们的工作不是让我们在封闭的环境中作业,我们可以通过各种方式搜索到解决方案。

当然有的问题,如果是解锁新技能的 “新题”,就直接看 “答案” 做,例如第 207210 题 “拓扑排序” 的模板题,第 70 题:动态规划的模板题,第 46 题:回溯搜索的模板题。

看 “答案” 的时候看思路,尽量不要看完,看懂别人的思路,就尝试自己写出来,用自己习惯的变量命名和编码风格写,卡壳的时候,再看 “答案”。

即使是自己独立做出来了,我认为也有必要看 “答案”,开阔自己的思路,我写的很多题解就是看 “答案” 看出来的,看别别人的答案我认为很关键的一点是要思考,别人是怎么想到的,有的时候,看别人的 “答案” 会有一种“卧槽,我 TM 怎么没想到”的感觉。

输出,让别人给你挑刺

题目不是做完就完了,根据我的经验,即使是会做的题目,过一段时间再做一次也未必做得出来。因此 “输出” 就是一个不错的方法,逼着自己把问题搞懂、搞透。
“输出” 比较好的方式是:

  1. 你身边有人,你把这个问题跟他(她)讲清楚,你们之间有讨论;
  2. 如果没有这个条件,把自己的思路写成题解发布在力扣的讨论区、如果觉得自己的题解特别不错,就发到题解区让别人给你挑毛病,你的代码就会在各种 “挑剔” 中写得越来越好。

我自己写题解以来,在后期会模仿官方题解写复杂度分析,这一块的确是我比较薄弱,并且疏忽的地方,在题解的评论区也有很多小伙伴对指出了我错误的复杂度分析,并给出了自己的看法,所以分享是多好的一件事情啊。

还可以发布在自己的博客、知乎,发朋友圈我觉得都是可以的,只要是有人看,你自己就会想着把代码越写越好。

多题一解,锻炼抽象概括能力

把同一类问题放在一起做一个整理,有些问题真的是有一定套路的。
例如:

  • 二分法问题:只要把怎么排除弄清楚,剩下的就全部是套路了;
  • 回溯搜索问题:画树形结构,思考怎么剪枝,剩下的工作就是用代码把画图和剪枝的过程展现出来;
  • 滑动窗口问题:是有模板的;
  • 二叉树问题:一般都是分治的思想;
  • 贪心算法:其实就是动态规划问题的所有子问题里,每一步都选那个最优的。

一题多解,锻炼发散思维能力

这个就蛮有意思了,越是难的问题,可能解法就越多。我有一点感触就是:越难的方法,效率越高,容错性就越低,越简单的方法,效率越低,容错性越高。我们有必要比较不同的方法的时间复杂度和空间复杂度,如果题目条件改一改、输入数据不符合题目要求,哪些方法还能奏效,哪些方法就失效了。

如果在面试中,你能够展示出一题多解的素质,我觉得是很加分的,当然可以讲究一些策略。比较好的一个策略是,先说朴素的、暴力的解法,同时也强调朴素、暴力解法存在的必要性,然后接着说一般性的解法,最后说有技巧性的解法。最后借用一个伟大的科学家说过的话:“天下没有免费的午餐”,各自分析不同方法的优劣,我觉得这种回答的方式就比较完美了。不建议一上来就说那个最有技巧的解法,这样面试官会认为你是有备而来的,并不是你真实的水平。

总结:万事开头难,请行动起来,多思考,多总结

以上就是我的一点点经验,倒不是说你真的这么做了,就能帮你解决所有问题,我觉得只要是我们付出了行动,真的迈开第一步去做了,我们的编码能力和解决问题的能力,都会逐渐得到提升,在这个过程中,你也有能力帮助他人,收获远比做出一道题要多。

刷题是个长期的过程,得用心,也有一定的方法,因人而异吧,希望能多听到大家的意见和建议。

233

今天是 8 月 8 日

去年 8 月份开始刷题,到当前为止马上满一年了,免费题已经全部刷完,每天或多或少都有提交没中断过(中间有几次空白是因为在早上 8 点之前刷的题没被记录到当天——之前不知道有这个限制)

连续刷题一年.png

第一遍刷题的做法是一页一页连续刷,分为简单、中等题以及困难题。

从上往下依次刷,碰到不会的题目先绕过,然后在页面的题目剩下不会题时选择一个合适的时间再去重点攻克。

其中比较简单的题目都是自己过了之后再看看时间复杂度比自己低的,然后参考实现一遍。

对付困难题目具体做法是:

  1. 自己先想 30 分钟左右,有思路就就直接码代码
  2. 如果 30 分钟左右没思路,或者思路是错误的,那么直接网上搜索别人的思路
  3. 首先不参考别人的代码,只看他们的思路,对照思路自己理解后开始码代码
  4. 对照思路也不理解的再,将他的代码翻译为自己熟悉语言的代码,一步步调试打印,然后理解别人的思路
  5. 如果是动态规划的题目尽量在理解了别人思路的基础上,然后再自己整理出来递推公式
  6. 最后将不会的题目或者认为特别经典,或者有特别精妙解法的题加入收藏以及不会题目列表,等待再次翻阅

这是第一遍的做法流程。

当然过程也不能仅仅只是自认为的懂了的程度,碰到一些比较有意思的题我都会将我的理解转换成代码注释或题解发布出来,以巩固自己的理解并同时为后面不会的人提供一个参考。

还有计划的第二遍以及第三遍

第二遍主要是刷第一遍时收藏的题目继续自测,继续巩固,最好换第二语言刷。

第三遍基本就不码代码了,而是归纳以及总结,希望做到看到这个题目,就能马上想到几种可能的做法,然后参考之前的做题的注释笔记,把一类类似的题目合并起来理解

当然每周日的周赛还是要尽量参加了。

48

📺 居然可以传视频了,搬一个之前找工作看到的不错的视频

来自油管
微软工程师:蔡克贺与他的 Leetcode 刷题之道
https://www.youtube.com/watch?v=Z3KrtEaw0vI&t=1055s

34

一边画画一边刷。

  1. 最好的学习方式就是以教会别人为目标去学习,在这个过程中,常常会发现,以为自己懂了其实还有很多细节没搞清楚。

  2. 思考最优解法,尽量减少时间和空间复杂度,尽管很多题目暴力可以破解,但如果那么做就失去了题目的魅力

每天共享一道题目,偶尔写一篇题解,画一幅画,有人喜欢,很开心~~

刷题也是工作之外的一种调剂,没什么不能分享的,共同成长

26

我是在裸辞期间刷的,所以对时间会特别焦虑,因此对刷题的投入和收益也会特别敏感。(虽然因为一些事情耽误现在也还没去投简历上班)。为了不造成盲目的浪费,我当时首先调查了网上所有关于刷题的资料和经验,来大概率保证自己在做合理的事情。
于是形成了一个刷题方法论,实际操作下来也确实有点帮助。
虽然大多数经验你们大概也在互联网的这里或那里看过,不过我还是摆在这里吧。更系统一些,也许能帮到一些朋友:

  • 最重要的是行动,现在立刻马上就去开始刷题。
  • 一看二抄三改四写。
  • 前期博客、文档、ppt比算法原理书重要。如果要学会用算法,书不够看也没必要,应该刷题。刷题时,首先还是要有方向、有脉络地刷题,切忌乱打拳,也就是要刷专题,刷专题就是说,找同类的题(一次只针对一种题型进行训练,如数组、链表、二叉树、回溯、动态规划),对题解打,逐步脱离题解,直到能自己做同类的题。
  • 切忌眼高手低。不要想着自己知道思路解法了就是会了,一定要亲自Coding,手撸出来。我在刷的过程中就经常在Debug的时候才发现自己忘记考虑了某些条件。不把代码写出来,只看别人的答案对自己是没有多大的提高的,只有亲自AC了题目,才能算做过一道题。
  • 可能刚开始会对手撸代码有压力有恐惧,总结就是心态一定要硬刚,总共就那几种题型,我刚开始也很抵触的,觉得太难了,后面迎难而上也就那么回事。第一遍不行就第二遍,不然就第三遍,直到现在***里面也有一些我不懂的题目,但我也不会去深究,大局为重,不抠细节。
  • 关于书:敲一个算法是编程能力,是简单的;但算法能力在于总结归纳一个算法(这个太难了,《算导》更加像是讲这个)和把问题与算法联系起来(这个应该培养)。如果要看书的话,按照书里面的算法一个一个学,每学一个算法之前找好几道使用这个算法的题(如果有个内行人带的话这步就很好做了),最好能有难度进阶。在学了算法之后立刻想这些题应该怎么做,然后做出来。
  • LeetCode上很多题目不仅需要一定的语言基础,毕竟gg,ms的面试题大都是这里面的,所以需要有数据结构,算法的基础,可以先撸完链表,STL相关的题目,去学数据结构再继续做吧。也有很多题目都是考查思维能力。而且这些题目需要你不断的去优化时间,空间复杂度,而不是简单的获得一个Accepted.
    如果不用肝竞赛没压力的话就最好了,就静下心来好好看看题解是怎么读透和解决一个题的,才是真正的ac。
  • 关于刷哪些题,和刷题顺序,建议按这个顺序刷题"Top 100 Liked Questions" -> "Top Interview Questions",这两个List中有很多重复的题,加起来一共150道左右。都是经典的题目,将这150道刷完基本上所有的题型都见过了,而且多数经典题目都会涉及,是提升最快的一个方法。
    然后就是各个大公司的题目,首选Amazon的,然后可以看看Zenefits的,接下来就是Google和Facebook的挑着刷。然后都是从简单到难的顺序刷。
    做好Easy,没必要死扣Hard。LeetCode上很多Easy的题目看似简单,实则想要写出Perfect的代码并非易事。多思考如何优化Easy,Medium的解法实际上比花精力解Hard题更能提高自己。况且面试的时候Hard被问的概率太小了。
  • 另外,一定要时常复习刷过的题,复习比一味的追求数量更重要。
  • 关于怎么总结归纳,总结归纳些什么:
    这里推荐一个龟派笔记刷题法,每道题都不是简单的刷一遍就过去的,而是反复练习,直到代码最优,解法最优(有时候甚至觉得自己的代码精简到一个符号都无法减少的地步)。用这个方法刷完题去面试,有时候面试官问问题,问题还没说完,你就知道应该如何表述自己的心路历程,然后慢慢地给出最优解。
    ————具体操作方案————
    对于遇到的每个题目,事后都做上标记:普通题目,难题、好题。
    每个题目都分为以下几个步骤做好详细的笔记:
    1. 原题目
    2. 自己的第一遍解法
    3. 网上好的解法
    4. 自己可以改进的地方
    5. 进一步精简优化自己的代码直至代码简无可简(这是非常关键的一步,到达这一步,才会发现获得能力的提升远远要超过简单地把题目解出来)
    6. 获得的思考(或者学习到的地方,可以是算法、数据结构或者Java的特性—例如Stream等等)
  • 然后​​注意积累工具类算法。
    什么叫工具类算法?就是你解一道算法题需要用到另一种算法,这个被调用的算法就是解决这道算法题的工具。​常见的比如:
    1. 「深度优先遍历」
    2. 「广度优先遍历」
    3. 「01背包」
    4. 「KMP算法」
    5. 「LRU算法」
    6. 常见的选择和排序算法
25

喵~从完全不懂开始刷~
先是按TOP100高频刷,从easy开始,不死磕,实在看不懂的就跳过,
一刷大概刷了大概50道,虽然很多做过的不一定能做出来,但是基本对各种常用套路都熟悉了

开始二刷,按照自然顺序刷,这次基本上一刷很多不会的都做出来了,同一类的题而且理解搞懂也快了很多,渐入佳境的感觉
二刷也开始按照专题整理,同一类题归纳总结

等之后面试前按照公司高频tag三刷,基本都是做过的题,就看能否完全独立写出代码

==================
不想刷了,刷再多都没用、、去面试hard难度做出来还是不要你。
本人不想做程序员,国内互联网对女性太不友好,去做主播了,祝我成为下个乔碧萝,月入十万

14

到现在虽然刷的不多,但是一道一道一遍一遍做下来,解决问题的思路真的明显的提升了。
有的时候会集中刷,比如5种类型,每种10题,一天刷完一种类型。过两天再刷第二次。没什么东西是学不明白的,如果有,就是练习的不够。
几十道题下来,整个人神清气爽,甚至获得了思路增长带来的快乐。
真的是十分快乐的事情,以后每到有时间,应该都要做几道题,巩固自己解决问题的思路。

14

我的新手经验是

  1. 先从简单的入手,通过了之后获得成就感正向激励自己。
  2. 像玩游戏一样做日常,坚持下来。
  3. 学习别人的题解,和别人讨论,开拓思路。
  4. 适当分享自己的题解,一个是为了交流,一个是相当于做笔记,一个也是自检的过程。当你能给别人讲明白,说明你真的明白了。
  5. 按照专题刷,专门学习知识点。

我在github上的做题记录

2

IMG_4DA93A4B8EA7-1.jpeg

手机刷题

2

没啥经验,全靠replication

1