如何在Leetcode达到2400分
笔者刷了半年题,Leetcode打到了2400分,国服排名300左右,算是一个里程碑吧,写下此文纪念,也算作给后来人一个经验贴。
笔者最初只是将Leetcode作为一个刷面试题的平台,防止工作面试时算法成为短板,但逐渐的,Leetcode成为了我的一个精神支柱,在懈怠之时,便看一看刷题群里、Leetcode Rank榜单里那些赫赫有名的人物仍然在激烈的讨论算法、学一些笔者根本听不懂的东西,也就有了继续学习的动力。
前言
防止被说成Leetcode云玩家,放一下自己的战绩。
2021年4月开始集中刷,到11月初达到2400分,拢共7个月的时间,中间还有很多懈怠的时候,如果读者努力,5、6个月应该就可以超过笔者。
上面是clist得到的分数曲线和AC题数清单。远古时期的比赛不算,笔者是从3月底开始打Leetcode周赛的,尽可能每周都打。能看到一直到7月以前,笔者都很少能做出来周赛的T4,完全是撞大运偶尔能蒙出来。到了9月之后,时不时的就可以冲击一下第四题。
学习路程
笔者数据结构基础学的还凑活,如果你基本的数据结构掌握的都不太熟练,推荐你看一遍浙江大学陈越姥姥的数据结构课程:https://mooc.study.163.com/course/1000033001
撇开数据结构基础不说,大部分人都关注的是刷题顺序、刷题技巧什么的。所以我把这部分放最开始说:没什么特别好的刷题技巧,大道至简,想做出题来,唯一的办法就是多刷。下面这些场景都是很正常的:
- 部分题刷好多遍还不会做。
- 对某一题型进行精练、集中突击之后,在比赛中仍然想不到。
- 刷了好几百道题偶尔周赛只能做出来2题
在Leetcode,坚韧是最好的品性,发发牢骚可以,不放弃就好。
入门
比较好的刷题顺序在知乎上或者一些帖子都总结的比较好——Hot100、剑指offer什么的,不需要问到底先刷哪些,这些入门的东西都刷掉,反正刷一遍也不够。
入门阶段主要目标是见过各种数据结构的应用和常见题型。遇到一道medium,即便不知道怎么做,看题解也能发现大部分都是自己学过的题型,这个时候大概就入门了。
这个阶段打比赛大概就是:
- “?这题还能贪心?”
- “树状数组是什么东西?”
- “这种解法为什么是对的?”
- “树上怎么DP?”
进阶
基础入了门,就该针对一些题型进行专门的训练了。根据打比赛或者平时做题时不同的题型进行专项的训练。
笔者这个时候是找的是前辈整理好的不同类型的题单,比如某一天看到了一道阿里笔试题是数位DP,届时笔者还不知道什么是数位DP,然后就集中的找别人总结好了的都是数位DP的题进行训练。
笔者比较喜欢找到题单之后只看题号,然后去刷,不会做了直接看题解,不怎么看题单作者的讲解,这个只是笔者个人习惯,在浏览器方便操作而已。也有人喜欢题单作者连贯的讲解和一致的行文风格,各有所爱,核心是把题做出来,读者可以遵从自己的刷题习惯。
下面是笔者做过的一些题单:
- 动态规划的套路:从入门到精通到弃坑,来自于残酷刷题群群主慧峰,涉及到了大部分DP的题型,并包含讲解,B站还有慧峰大佬的讲解。
- 背包九讲----整理+例题:经典DP问题,这个我找到的好像不是官网,读者可以自行查找
- 树形DP总结:来自Leopold大佬的总结,我已经忘记是怎么搜到这个大佬的题单了,也不认识这位大佬,但是大佬推荐的题还是很不错的。
- 状压DP:同来自Leopold
- 数位DP:同来自Leopold
- 宫水三叶的刷题日记:经常刷题的应当认识三叶大佬,这是三叶大佬总结的题单
还有一个网络大佬总结的企业面试题出现频率:CodeTop,笔者根据频率在这个网站上做了300多道,后续觉得对比赛帮助不大,后面就不使用这个网站了,笔者可以自行挑选。
还有残酷刷题群的Leetcode每日一题,这和Leetcode官方每日一题不同,这是残酷群群主自己总结的题,题目选择非常的好,读者可以根据里面标记的题目Tag来刷。
多刷
掌握了以上的东西,你的水平应该就已经比笔者高了。笔者达到上面的进度使用了7个月,Leetcode刷题量将近1100道。
然后就是一些比较玄学的题感问题了,就是看到题就知道这道题是什么方法,能很快想到这个题可能的坑点并写代码的时候bug free。因为一类题型并不是做几道就能完全掌握的,需要大量的练习,唯一的办法就是多刷题,保持刷题的手感,坚持打比赛,并能比赛结束后及时的进行补题。
下面是笔者的一个刷题的时间路线:
- 06/03:500题
- 06/27:600题
- 08/05:700题
- 09/08:800题
- 09/20:900题
- 09/26:1000题
最后基本的题型都见过了,同时很多题型也进行过针对性的训练了,应该在比赛的时候就能稳定3题了。这个时候再加大题量,加快一下做题的速度,偶尔再能冒出一次AK,2400分就手到擒来了。
有关不会的题
比赛时遇到不会的题一定要补题!不然这次比赛就白打了。补题之余,如果能再根据不会的题找相似的、同题型的题多做一做,就更好了。
提高竞赛分数的唯一办法就是多做自己不会的题,同时即便这次做了,下次也并不一定会,所以一道题做很多遍是很正常的,下面是笔者某一道题的提交记录:
因为一道题并不能说做一次就能掌握,所以偶尔回顾自己的错题是很有必要的。笔者使用的是Leetcode自带的收藏夹,每次遇到不会的需要补题的就加入到收藏夹,然后想起来了就去收藏夹集中的补一遍题,目前为止笔者的收藏夹里还躺着三十多道不会做的:
当我从收藏夹打开一道题能不看题解完整做出来时,我就会将这道题从收藏夹里删掉。当然,也并不是这次能完整做出来下次就能做出来,这次能完整做出来的题,下次仍然可能想不到,于是有可能一道题可能在错题本里进进出出很多次。
最后,非常重要的一点:很多新人会觉得脑子里还记着之前看过的题解,做题的时候想的都是题解里面的做法,不是自己思考的,这是错误的。能想到题解的做法,就已经是你大脑思考的了,下次做题的时候,你就有可能想到有的题和你做过的题很类似,然后套用之前的做法,这是很正常也是很合理的。这次能想到题解,下次就能完全理解题解,故而自己能思考出越来越多的东西,也就能解决越来越多的题。
残酷刷题群
残酷刷题群是一个很卷的组织,群规请点击,里面有非常多的大佬。核心群规只有2条:
- 每日打卡,打卡题目由群主确定
- 连续的3周内必须参加2次周赛
以上2条,加上每次周赛的倒数10%,将要收到惩罚,惩罚为发200块左右的红包。而给你带来的就是每天能在群里看到大佬们对算法的思考和讨论 ,笔者觉得受益匪浅。同时如果你不需要发红包的话,每周还能领几顿晚饭钱的红包,如果你对残酷刷题群感兴趣,可以加我的vx详聊: