1. 前言
所以本文章主要就是详细的告诉大家我的刷题方法论,可以做一个参考,如果你觉得我的分享对你有帮助,希望多多点赞收藏评论转发支持!
2. 算法题到底该怎么刷?
回答这个问题只需要两个点:一是刷什么题,二是用什么方法刷
2.1 刷什么题?
首先来回答第一个问题,刷什么题?
- 《剑指Offer》
- LeetCode 前200道 + 热题100(这些有高度重合)
- CodeTop 里按类别可以把前30道题给刷了,部分比较高频的类别比如链表,就可以把出现频次大于20的题都给刷了。
以上题大都有重复,总共估计就300题,甚至不到300题,只要会这些题,应付国内大厂的笔试面试足够了!
我的经验是,不用一直刷新的题目,只要能做到把这200多快300道高频题融会贯通,那么就可以应付笔试足够,应付面试有余了。
资料分享(一些我觉得不错的资料/公众号题解分享)
因为只看一个题解有时候会看不懂,所以不要不要被一段代码所卡住!如果你看不懂的话,可以多找几个讲解的人、博客来看一下,总要有一个人跟你的想法是相似的,脑回路是一样的。下面就列举一下我当时看的一些大佬写的题解,集思广益很重要!
- CodeTop:
- 代码随想录(必看)
- liweiwei(weiwei哥写题解真的是不厌其烦,各种细节都掰开了揉碎了给你往嘴里塞)
还有其他我看的一些题解,不多,但他们都或多或少对我有帮助,很感谢这些大佬把业余时间拿出来进行分享。
- 负雪明烛:
- gzh:负雪明烛
- 力扣加加 / lucifer:
- gzh:力扣加加
- pdf:去 github 下载
- labuladong:
- 公众号:labuladong
- pdf:我不记得在哪下载了,去公众号上应该能找到
- 甜姨(写的题解不多,但是很通俗易懂):
- gzh:甜姨的奇妙冒险
- leetcode
- 宫水三叶(三叶姐只在leetcode上写每日一题)
2.2 怎么刷?
-
刷一道题分三个阶段来看:
- 第一层:做到“能够根据脑子里这张图把算法的流程用极为精确的语言描述出来,并且画出来那张算法分析的动态图”,其实就是讲思路!并且能够分析不同的算法的时空复杂度!
- 第二层:“码形结合”的能力,能够根据脑子里这张图把算法的伪代码大致写出来。这里提到一个我自创的名词 “码形结合”,因为也是受到高三做题时的 “数形结合” 的启发,其实写代码有时候也是需要你在心里先有一个数据结构的图,然后根据这张图来把代码实现。比如【回溯算法】的本质其实就是N叉树的遍历,并加上了一些剪枝操作,如果你能在心里把【回溯算法】的N叉数的各个节点的分裂情况给画出来,那么这道题就成功了一半了。
- 第三层:实现能力,“ 能够不假思索的一边讲思路,一边把代码敲出来并且能够AC”,这个就是面试的最高境界,能一边把整个题的宏观思路给面试官顺下来,一边把题目按你的思路一项一项的去实现。除此之外,还需要有一定的触类旁通思维,能把这道题抽象出来一个算法模型。例如(718. 最长重复子数组)其实就是考察LCS(Longest Common Subsequence)最长公共子序列问题。
-
要做到这三点,一道题至少至少要刷三遍,我有的题甚至刷了有五六遍七八遍才能闭着眼AC,例如N个一组反转链表这道题我前前后后得做了有快10遍:
- 第一遍,记在你的笔记里,想半分钟如果没思路,可以直接看答案,在初期刷题没什么思路时,不要浪费时间,直接看看正确的思路是啥。并且无需拘泥于一个题解,如果一个题解吭哧吭哧半天看不懂,那就换个题解,总要能找到一个思路和你相似、脑回路和你相近的人,迟早会把题搞明白。
- 第二遍,在本子上画画数据结构的图,写写伪代码,这样做主要是让你的思路清晰,能讲清楚,至少能达到刷题 “第一层” 的境界。
- 第三遍,直接什么答案都不看,上手编程,熟知考察的重点和实现的细节,以及实现过程中的各种坑。
-
记笔记很重要,很重要,很重要!主要记录自己的易错点!
- Leetcode的功能很棒,可以在每次你的提交后面写个备注,比如你这次做错了是因为啥,粗心还是算法没想清楚,都可以记录在leetcode的提交备注功能里。举个例子,如下图所示。
手机上的Anki备忘录用起来,anki之前主要是用来背单词的,可以根据遗忘曲线提醒你今天该复习哪个单词了。其实用在刷题上也一样,可以在anki备忘录上把同类题记在一起,anki可以根据复习时间提醒你哪一天该复习哪些内容了。在anki上的记录不用太详细,主要把算法题的思路、核心点、易错点简单写个轮廓就ok啦!可以地铁上没事也可以刷一刷。
-
刷题的前记后忘现象很常见,不用担心,只要你针对每道题都建立了笔记文档,并且按类别进行归类整理了以后,你要做的只是把这道题的核心点再回顾一下,然后再 “闭着眼睛” 刷一遍就ok了,总要有能记住的那一遍的。
-
不求一题多解,但求多题一解。其实除了一些比较简单的题可能会问多种解法以外(比如反转链表的递归和迭代两种写法,二叉树遍历的递归和迭代两种写法)。所以抽象思维很重要,把多道题都映射到同一个模型上,举个例子,比如“1035 不相交的线”就可以抽象成 LCS 问题。
3. 我按分类总结的题号 + 各个类型比较不错的博客资料
下面把我平时针对每道题的题号收集、博客资料收集的文档都分享给大家。
注意!这个题号并不是说就要全部都刷,因为时间来不及,一定把我上面提到的高频题按分类给刷明白了,如果有余力再把剩下的给刷了!
3.1 双指针 & 滑动窗
袁厨的双指针专题:https://mp.weixin.qq.com/s/C4ZFwyJThBJdyqbNo87isQ
袁厨的题目收集:https://mp.weixin.qq.com/s/raAfG79JZtnuOwvAGE8xMA
双指针:
lc 27 移除元素
lc 209 长度最小的子数组
lc 141 环形链表
lc 142 环形链表
lc 328 奇偶链表
lc 160 相交链表
lc 21 合并两个有序链表
lc 88 合并两个有序数组
lc 15 三数之和
lc 18 四数之和
lc 83 删除排序链表中的重复元素
lc 673. 最长递增子序列的个数
lc 300. 最长递增子序列
1004. 最大连续1的个数 III
最长递增子序列
https://blog.csdn.net/ltrbless/article/details/81318935
滑动窗:
3 无重复字符的最长子串
209 长度最小的子数组
53 最大子序和
84 柱状图中最大的矩形
239 滑动窗口的最大值
424 替换后的最长重复字符
1004 最大连续1的个数 III
1438 绝对差不超过限制的最长连续子数组
5682 lc 周赛 所有子字符串的美丽值
剑指 Offer 41 数据流中位数
剑指 Offer 42 连续子数组的最大和
剑指 Offer 59 - I 滑动窗口的最大值
- 无重复字符的最长子串
- 串联所有单词的子串
- 最小覆盖子串
- 至多包含两个不同字符的最长子串
- 至多包含 K 个不同字符的最长子串
- 长度最小的子数组
- 滑动窗口最大值
- 字符串的排列
- 最小区间
- 最小窗口子序列
3.2 递归 & 二叉树
因为 递归和二叉树 总是同时出现,所以放在一起了。
二叉树
lc 144 二叉树的前序遍历(递归 + 迭代 + morris)
lc 94 二叉树的中序遍历(递归 + 迭代 + morris)
lc 145 二叉树的后序遍历(递归 + 迭代 + morris)
lc 110 平衡二叉树
lc 112 路径总和 I
lc 113 路径总和 II
剑指 27 二叉树的镜像
剑指 28 对称的二叉树
剑指 55 - I 二叉树的深度
lc 102 二叉树的层序遍历
lc 98 验证二叉搜索树(中序遍历)
lc 129 求根到叶子节点数字之和
lc 124 二叉树最大路径和
lc 235 二叉搜索树的最近公共祖先
lc 236 二叉树的最近公共祖先
lc 226 翻转二叉树 三种方法,DFS 递归、DFS 迭代、BFS 层序
lc 39. 组合总和
lc 46. 全排列
lc 404 左叶子之和
lc 700 二叉搜索树中的搜索
lc 96 不同的二叉搜索树
lc 669 修剪二叉搜索树
lc 106 从中序与后序遍历序列构造二叉树 同 剑指 Offer 07 重建二叉树
下面是 weiwei 收集的
作者:liweiwei1419
- 二叉树中的最大路径和
- 二叉树的直径
- 二叉树最长连续序列
- 二叉树中最长的连续序列
- 最长同值路径
- 二叉树中的最长交错路径
- 具有所有最深节点的最小子树
3.3 递归 & 回溯
3.3.1 做题套路自我总结
所有回溯递归都是一样的套路,明确递归的对象,对一个节点进行考虑,正如二叉树一样,回溯其就是 N叉树 + 剪枝
- 明确递归的对象,要对哪个节点进行递归(二叉树)?还是对一张表的一个格子进行递归(岛屿问题)?还是要对一个状态进行递归(全排列树状图画出来)?
- 明确结束条件,到底到什么地方算是结束了,或者说达到什么条件就需要保存一下状态?
- 递归工作,该节点如果不满足结束条件,那对它进行一些什么操作,对它连接的节点进行什么操作?如何继续往下分叉?
- 返回值,根据递归工作要返回什么值(岛屿面积)?
3.3.2 题目收集
- 括号生成
- 组合总和
- 全排列
- 求根到叶子节点数字之和
- 路径总和 II
- 全排列 II
- 三数之和
- N 皇后 变态不做了!
- 组合总和
- 组合总和 II
- 全排列
- 全排列 II
- 组合
- 子集
- 子集 II
- 电话号码的字母组合
- 单词搜索
3.4 堆
295 数据流中位数
480 滑动窗口的中位数(难啊 不会)
215 排名前 k 的元素
569 员工薪水中位数??
4 寻找两个正序数组的中位数
347 前 k 个高频元素
703. 数据流中的第 K 大元素
剑指 40: 最小的 k 个数
480 滑动窗中位数 (大根堆 堆排 对顶堆)(难啊 不会 低频题,不做)
3.5 动态规划
509 斐波那契数
70 爬楼梯
746 使用最小花费爬楼梯
121 买卖股票的最佳时机
122 买卖股票的最佳时机
123 买卖股票的最佳时机
322. 零钱兑换
518. 零钱兑换
64 最小路径和
198 打家劫舍
213 打家劫舍 II
5 最长回文子串
120 三角形最小路径和
lc 673. 最长递增子序列的个数
lc 300. 最长递增子序列
62. 不同路径(中等):路径问题第一讲
63. 不同路径 II(中等):路径问题第二讲
64. 最小路径和(中等):路径问题第三讲
120. 三角形最小路径和(中等)
931. 下降路径最小和(中等)
1289 下降路径最小和 II(困难)
1575. 统计所有可行路径(困难)
576. 出界的路径数(中等)
1301. 最大得分的路径数目(困难)
647. 回文子串
5. 最长回文子串
718 最长重复子数组
1143 最长重复子序列
678 有效的括号字符串
3.6 贪心算法
45 跳跃游戏II
55 跳跃游戏
435 无重叠子区间
1784 检查二进制字符串字段
1785 构成特定和需要添加的.....
3.7 链表
21 合并两个有序链表
23 合并 K 个升序链表
92 反转指定位置链表
25 k 个一组反转链表
61 旋转链表
2 两数相加!!!
19 删除链表倒数第 K 个节点!
19 删除链表的倒数第N个节点 两种实现+图解 中等
21 合并两个有序链表 两种实现+图解 简单
23 合并K个升序链表 四种实现+图解 困难
24 两两交换链表中的节点 三种实现+图解 中等
25 K 个一组翻转链表 两种实现+图解 困难
61 旋转链表 两种实现+图解 中等
82 删除排序链表中的重复元素 II 三种实现+图解 中等
83 删除排序链表中的重复元素 两种实现+图解 简单
141 二叉树展开为链表 四种实现+图解 中等
138 复制带随机指针的链表 两种实现+图解 中等
141 环形链表 两种实现+图解 简单
160 相交链表 两种实现+图解 简单
203 移除链表元素 两种实现+图解 简单
206 反转链表 两种实现+图解 简单
234 回文链表 图解 简单
237 删除链表中的节点 图解 简单
876 链表的中间结点 图解 简单
328 奇偶链表
3.8 二分法
3.9 位运算
137
136
260
645
IP 与整数的互换
3.10 辅助栈
矩阵的最小面积
155 最小栈
739 每日温度
剑指 Offer 59 - II 队列的最大值
剑指 Offer 59 - I 滑动窗口的最大值
lc 239 滑动窗口的最大值
42 接雨水
496 下一个更大元素 I
503 下一个更大元素 II
1081 不同字符的最小子序列
- 接雨水(困难) 暴力解法、优化、双指针、单调栈
- 每日温度(中等) 暴力解法 + 单调栈
- 下一个更大元素 I(简单) 暴力解法、单调栈
- 去除重复字母(困难) 栈 + 哨兵技巧(Java、C++、Python)
- 股票价格跨度(中等) 「力扣」第 901 题:股票价格跨度(单调栈)
- 移掉K位数字
- 最短无序连续子数组
3.11 前缀和
- 子数组异或查询
- 删除排序链表中的重复元素 II
3.12 拓扑排序
- 课程表
- 课程表 II
4. 后记
刷题真的很重要,不管是应届求职,还是社招跳槽,都需要体现出一定的算法能力才能过关。
希望这篇分享能帮助到大家!祝大家都拿到满意的offer!