LeetCode刷题指南

文章目录
  1. 知识点
  2. 刷题方法
    1. 1. 刷题顺序
    2. 2. 利用题解
    3. 3. 精益求精
    4. 4. 自己写题解
    5. 5. 参与竞赛
    6. 6. 考取证书
  3. 刷题阶段
  4. 什么时候可以停止刷题?
  5. 资源
    1. 1. 经典面试题
    2. 2. 书籍推荐
    3. 3. 视频
    4. 4. 工具
    5. 5. 网站

知识点

  • 时间 / 空间复杂度分析

  • 数据结构

    • 数组
    • 字符串
    • 队列
    • 链表
    • 集合
    • 哈希表
      • 二叉树
      • 多叉树
      • 字典树
  • 算法

    • 排序
    • 双指针
    • 查找
    • 分治
    • 动态规划
    • 递归
    • 回溯
    • 贪心
    • 位运算
    • DFS
    • BFS

面试无非就那么几个重点:树、动态规划、深度 / 广度优先搜索、链表、数组、排序、栈、队列、哈希、字符串等。

刷题方法

1. 刷题顺序

刚开始刷题,从 Leetcode 刷起,如果觉得难,那就可以试一试《剑指offer》,刷完这个再刷 Leetcode,这样效率更高

记住三个要点:从【学习板块 LeetBook】刷起,从【简单的】刷起,从【通过率高】的刷起!

先完成专项练习中一些简单的题目,理解其背后的算法和数据结构。

之后,再举一反三,练习更多相关的题目。

当你能做到用同一个算法解决一类共性问题,做到 多题一解 时,才算是真正理解了。

如果是新手刷题的话,推荐先从「简单」难度等级的算法题开始刷题。
等简单题上手熟练之后,再开始按照标签类别,刷中等难度的题。
中等难度的题刷差不多之后,可以考虑刷面试题或者难题。
其实 LeetCode 官方网站上就有整理好的题目不错的刷题清单。链接为:https://leetcode.cn/leetbook/。可以先刷这里边的题目卡片。
我这里也做了一个整理。推荐刷题顺序和目录如下:1. 初级算法 2. 数组类算法 3. 数组和字符串 4. 链表类算法 5. 哈希表 6. 队列 & 栈 7. 二分查找 9. 二叉树 10. 中级算法 11. 高级算法 12. 算法面试题汇总我之前刷过的 LeetBook 清单:
或者:数组-> 链表-> 哈希表->字符串->栈->队列->树->回溯->贪心->动态规划->图
当然还可以通过官方新推出的「学习计划 - 力扣」按计划每天刷题。

刷完 Leetbook 专栏后,进入题库,利用 LeetCode 自带的题目筛选和排序功能,能够帮助我们由简单到中等再到困难,渐进式刷题。一般来说,先刷通过率较高的题目,相对比较容易。

注意:一定要把自己做过的每道题目代码都自行保存好,定期复习

2. 利用题解

既要理解作者做题的思路和逻辑,也要细致入微地学习他人代码中优秀的写法。学习更多他人解题的思路,帮助自己打开脑洞,做到 一题多解

除了 LeetCode 自带的题解之外,网上有很多其他大佬整理的算法题解,比如全网疯传的谷歌大佬算法刷题笔记(C++ 语言)。

现在网上的题解实在是太多啦!在刷题时,读个一两份就行了,别给自己太大压力

关于题解,霜神建议这样使用:

  1. 先自己读题,思考如何解题。如果 15 分钟还没有思路,那么先看笔者的解题思路,但是不要看代码
  2. 有思路以后自己用代码实现一遍
  3. 如果完全不会写,那就看笔者提供的代码,找出自己到底哪里不会写,找出问题记下来,这就是自己要弥补的知识漏洞
  4. 如果自己实现出来了,提交以后有错误,自己先 debug
  5. AC 以后没有到 100% 也先自己思考如何优化。如果每道题自己都能优化到 100% 了,那么一段时间以后进步会很大。
  6. 所以总的来说,实在没思路,看解题思路;实在优化不到 100%,看看代码。

3. 精益求精

虽然答出题目就已经很棒了,但还不够。

面试的时候,一些面试官就喜欢给你出题目的变种,或者要求你用更优的方式解出题目

所以,在保证完全理解题目解法的基础上,请不断优化你的代码,找到更多的思路和更优解,直到击败 100% 的用户

认真对待每一道算法题目,把它当成一个工程问题来解决,相信你的思维会逐渐打开,并逐渐掌握编写高性能程序的技巧。

4. 自己写题解

除了看题解外,很多同学没有意识到,多写题解,才是真正的法宝,把自己的解题思路整理成文,或者讲给别人听

甚至有一些厉害的同学通过记录和分享自己的题解,还没毕业,就已经出版了自己的书籍,年入几十万或者百万

刷算法题,有一个十分有用的技巧,就是「写解题报告」。
如果你刷完一道题,能把这道题的解题步骤、做题思路用通俗易懂的话写成解题报告,那么这道题就算是掌握了。
这其实就相当于「费曼学习法」的思维。
这样,也可以减少刷题的遍数。
如果在写题的时候遇到之前刷过的题,但一时之间没有思路的,就可以看看自己之前的解题报告。这样就节省了大量重复刷题的时间。

5. 参与竞赛

LeetCode、牛客等网站每周都会开展一次线上算法竞赛,看看谁能在有限时间内最快最多地解题。

在竞赛的过程中,紧张刺激的环境会使我们的精神保持高度集中,能够激发出我们的思维,从而在有限的时间内进行更多的思考,也能帮助我们适应面试的节奏。

参加蓝桥杯竞赛也是不错的,我自己也参加了两届,题目的难度和找工作要求的算法题目难度相当,也能发现自身的不足、激励自己进步吧。

6. 考取证书

这几年,PAT 计算机程序设计能力考试在逐渐升温,分为顶级、甲级、乙级三个级别。

我亲身参与过甲级和乙级的考试,难度适中,虽然目前这个证书的含金量不高,但在备战考证的过程中,你有一个学习的目标,会更有动力坚持下去。在我看来,过程大于结果。

网址:https://www.patest.cn/

刷题阶段

刷题大概可以分为 4 个阶段。

  1. 纯小白,不知道怎么刷题,对很多概念都很陌生,各种数据结构和知识点几乎完全不懂,打开 LeetCode 第一题,满头问号。

  2. 算法上基本已经入门,Easy 可以做出来,Medium 纠结半天也能有头绪,但基础不牢,比如字符转字符串还得 Google 一下。

  3. 刷了几百道题后,总结了自己的解题模板,参加周赛有时候甚至可以全部完成

  4. 开始以 beat 100% 作为 AC 的目标了。

就目前的算法面试大环境来说,能达到第二阶段,中小公司可以应付过去了,到达第三阶段,字节、腾讯算法面试环节妥妥没问题了

怎么样到达第三阶段?给一下我的一些小建议吧。

  1. 如果目标是国内大厂,那么一定要刷足够的题,不需要把 LeetCode 上 2500 道算法题都刷完,但**至少刷 200 道算法高频题**,这些高频题我都写了题解同时也录制了视频,在这个链接总结了:https://www.algomooc.com/1659.html

  2. 面试前一周以看题为主,因为刷题也刷不了几题,多看看自己总结或者别人总结的模板,比如回溯算法模板,掌握后,几十道回溯题都不在话下。

  3. 刷题过程需要注意难度要循序渐进,算法训练是一个系统工程,需要循序渐进,太过于急功近利,反而容易因做不出难题而产生挫败感,带来反效果。

什么时候可以停止刷题?

至于什么时候可以停止刷题了呢?这也要看你刷题的目的,是找工作还是持续锻炼思维提升自己?

无论如何,刷题一定要养成习惯,像高考做卷子一样,每天最好固定一个黄金时间,坚持做几道题目,而不是急于求成、爆发式刷题

根据我过去一年多和小伙伴们一起刷题打卡的经验发现:那些能够坚持每天刷题,并最终学会一整套「基础算法知识」和「基础数据结构知识」的人,总是少数人。

大部分人总会因为种种主观和客观原因而放弃了刷题(工作繁忙、学习任务繁重、个人精力有限、时间不足等)。但不管怎么样,如果你当初选择了学习算法知识,选择了通过刷题来通过面试,以便获取更好的工作岗位。那我希望在达成自己的目标之前,可以一直坚持下去,去「刻意练习」。在刷题的过程中收获知识,通过刷题得到满足感,从而把刷题变成兴趣。希望大家能够一起坚持刷题,争取早日实现自己的目标。

资源

1. 经典面试题

2. 书籍推荐

刚才我说了很多种题型,对于按题型刷题总结首推《程序员代码面试指南:IT名企算法与数据结构题目最优解》,这本书真的挺不错,大部分题型都总结了,而且每个专题有十几二十道,这里建议大家买本来学习。

还要一本我大一看的,感觉也挺不错,叫做《挑战程序设计大赛》,不过这本比较适合不急着面试的吧,这本不像上面那一本,专门来总结各种题型应付面试。

《编程之美》、《编程珠玑》也建议看,这两本我觉得比较有趣,不是说让你一直刷题一直刷题,这两本你可以买来看看,会给你带来一些思路,这两本我是只看,没动手打代码。

Leetcode 刷题的时候,也是可以分题型刷滴,所以也可以去 leetcode 刷题,不过刷题的时候,我这里有个建议,就是别在本地 IDE 写代码,直接在网页端写就行了。因为面试的时候,一般就让你在记事本写代码,不会给你 IDE。如果你不习惯,估计很容易写错代码,而且,有些库函数你也把名字忘记了。网页端其实也是挺方便的,也会有一些代码提示。

3. 视频

4. 工具

5. 网站

参考:
刷了 1000 多道算法题,一点心得(鱼皮原创)
leetcode 刷500道题,笔试/面试稳吗?谈谈算法的学习
霜神
力扣(LeetCode)
吴师兄学算法