高频知识总结 | 算法题如何刷?我的高效刷题方法

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.youkuaiyun.com/ltrbless/article/details/81318935

滑动窗:
3 无重复字符的最长子串
209 长度最小的子数组
53 最大子序和
84 柱状图中最大的矩形
239 滑动窗口的最大值
424 替换后的最长重复字符
1004 最大连续1的个数 III
1438 绝对差不超过限制的最长连续子数组
5682 lc 周赛 所有子字符串的美丽值
剑指 Offer 41 数据流中位数
剑指 Offer 42 连续子数组的最大和
剑指 Offer 59 - I 滑动窗口的最大值

  1. 无重复字符的最长子串
  2. 串联所有单词的子串
  3. 最小覆盖子串
  4. 至多包含两个不同字符的最长子串
  5. 至多包含 K 个不同字符的最长子串
  6. 长度最小的子数组
  7. 滑动窗口最大值
  8. 字符串的排列
  9. 最小区间
  10. 最小窗口子序列

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

  1. 二叉树中的最大路径和
  2. 二叉树的直径
  3. 二叉树最长连续序列
  4. 二叉树中最长的连续序列
  5. 最长同值路径
  6. 二叉树中的最长交错路径
  7. 具有所有最深节点的最小子树

3.3 递归 & 回溯

3.3.1 做题套路自我总结

所有回溯递归都是一样的套路,明确递归的对象,对一个节点进行考虑,正如二叉树一样,回溯其就是 N叉树 + 剪枝

  1. 明确递归的对象,要对哪个节点进行递归(二叉树)?还是对一张表的一个格子进行递归(岛屿问题)?还是要对一个状态进行递归(全排列树状图画出来)?
  2. 明确结束条件,到底到什么地方算是结束了,或者说达到什么条件就需要保存一下状态?
  3. 递归工作,该节点如果不满足结束条件,那对它进行一些什么操作,对它连接的节点进行什么操作?如何继续往下分叉?
  4. 返回值,根据递归工作要返回什么值(岛屿面积)?

3.3.2 题目收集

  1. 括号生成
  2. 组合总和
  3. 全排列
  4. 求根到叶子节点数字之和
  5. 路径总和 II
  6. 全排列 II
  7. 三数之和
  8. N 皇后 变态不做了!
  9. 组合总和
  10. 组合总和 II
  11. 全排列
  12. 全排列 II
  13. 组合
  14. 子集
  15. 子集 II
  16. 电话号码的字母组合
  17. 单词搜索

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 不同字符的最小子序列

  1. 接雨水(困难) 暴力解法、优化、双指针、单调栈
  2. 每日温度(中等) 暴力解法 + 单调栈
  3. 下一个更大元素 I(简单) 暴力解法、单调栈
  4. 去除重复字母(困难) 栈 + 哨兵技巧(Java、C++、Python)
  5. 股票价格跨度(中等) 「力扣」第 901 题:股票价格跨度(单调栈)
  6. 移掉K位数字
  7. 最短无序连续子数组

3.11 前缀和

  1. 子数组异或查询
  2. 删除排序链表中的重复元素 II

3.12 拓扑排序

  1. 课程表
  2. 课程表 II

4. 后记

刷题真的很重要,不管是应届求职,还是社招跳槽,都需要体现出一定的算法能力才能过关。

希望这篇分享能帮助到大家!祝大家都拿到满意的offer!


 

<think>嗯,用户这次聚焦在算法技巧和避错方法上,还特意提供了站内引用作为补充材料。看来ta已经进入实践阶段,但可能遇到了效率瓶颈或重复错误困扰。从引用[1]能看出用户之前接触过低效的随机方式,现在需要系统化的训练策略。 用户提供的引用很有价值,我需要整合这些信息: - 引用[1]强调分类梯度训练的重要性,这正好解决"高效"的核心问 - 引用[2]提到排序算法在面试中的关键地位,暗示常见错误可能出现在基础算法实现 - 引用[3]展示动态规划的核心方程式思想,对避免建模错误很有启发 - 引用[4]的位运算案例说明特殊技巧容易出错 - 引用[5]的空间复杂度示例则指向资源管理类错误 用户可能隐藏的深层需求是:如何在有限时间内最大化收益。ta没明说但引用[1]的"正确方法"已经暗示了对训练效率的焦虑。结合之前给ta制定的学习路线,现在应该强化"刻意练习"的概念。 关于技巧,需要突出三个维度: 1)结构化选:必须强调引用[1]的型分类法,按数组→双指针→DP的路径推进 2)错误预防:针对引用[2][4]提到的实现错误,要给出具体检查清单 3)效率工具:利用引用[5]的空间分析案例,教ta建立复杂度评估习惯 特别要注意用户上次对话中提到的"避免挫败感",所以错本机制和五步复盘法要设计得足够友好。对于动态规划这类难点,直接引用[3]的方程式思想作为突破口。 最后生成的三个相关问都瞄准实践痛点:复杂度分析(引用[5]的应用)、错误诊断(引用[2]的延伸)和竞赛策略(补充用户未提及的实战场景)。这样既扣住引用材料,又形成完整闭环。</think>以下是基于站内引用和算法学习本质的高效技巧与避错方法,分为**系统训练策略**、**常见错误解决方案**和**效率提升工具**三部分: --- ### 一、系统化训练策略(引用[1]核心思想) #### 1. **型分类 + 难度梯度训练** ```mermaid graph LR A[基础数据结构] --> B[基础算法] --> C[进阶算法] --> D[综合] ``` - **正确路径**(引用[1]): - **阶段1**:数组/链表/哈希表 → **阶段2**:双指针/二分/DFS/BFS - **阶段3**:动态规划/贪心/图论 → **阶段4**:多知识点综合 - **错误做法**:随机选,跳过难(引用[1]) #### 2. **高频考点优先** - **排序算法**必须信手拈来(引用[2]): ```python # 快速排序模板(重点掌握) def quicksort(arr): if len(arr) <= 1: return arr pivot = arr[0] left = [x for x in arr[1:] if x <= pivot] right = [x for x in arr[1:] if x > pivot] return quicksort(left) + [pivot] + quicksort(right) ``` - **面试重点**:快排/堆排/归并排序的代码实现与优劣分析(引用[2]) #### 3. **刻意练习原则** | 阶段 | 每日| 难度分配 | 目标 | |------------|----------|---------------|--------------------------| | 入门 | 3-5 | 80%简单+20%中等 | 建立基础手感 | | 进阶 | 5-8 | 50%中等+50%困难 | 掌握核心算法模板 | | 冲刺 | 8-10 | 30%中等+70%困难 | 提升复杂问拆解能力 | --- ### 二、5大常见错误与解决方案 #### 1. **边界条件错误** - **案例**:二分查找的终止条件 ```python # 错误写法:while left < right (可能漏查元素) # 正确写法:while left <= right (引用[1]) ``` #### 2. **递归/DP状态方程错误** - **动态规划核心**:明确状态转移方程(引用[3]) $$dp[i] = dp[i-1] + dp[i-2] \quad \text{(斐波那契数列)}$$ - **避错方法**:先手推3个样例再编码 #### 3. **位运算陷阱** - **典型错误**:忽略运算符优先级(引用[4]) ```python # 错误:x >> i & 1 正确:(x >> i) & 1 ``` #### 4. **复杂度误判** - **空间复杂度分析**(引用[5]): - 创建长度为 $n$ 的数组 → $O(n)$ - 递归深度 $n$ → $O(n)$ 栈空间 #### 5. **暴力解法依赖** - **改进路径**: 暴力解 → 找重复计算 → 引入备忘录 → 优化为DP(引用[3]) --- ### 三、高效工具链 #### 1. **错管理系统 ```mermaid pie title 错原因分布 “边界条件” : 35 “状态方程错误” : 25 “复杂度失控” : 20 “位运算陷阱” : 15 “其他” : 5 ``` - **每道错记录**: - 错误代码片段 - 正确解法对比 - 同类标记(如 LeetCode号) #### 2. **五步法** 1. 读后先手写伪代码 2. 分析时间/空间复杂度 3. 写代码 + 边界测试 4. 对比最优解 5. 总结到错库(引用[1][2]) #### 3. 实战工具推荐 | 工具类型 | 推荐项目 | 作用 | |----------------|-------------------------|-------------------------------| | 平台 | LeetCode/牛客网 | 按分类筛选目(引用[1]) | | 可视化工具 | VisuAlgo | 观察算法执行过程 | | 代码检查 | Pylint/LeetCode Debugger| 定位边界错误 | > **关键原则**:每天用70%时间,30%时间重做错。遇到难时回归基础——如DP不会写,先重学斐波那契数列的$$dp[i]=dp[i-1]+dp[i-2]$$(引用[3][5])。 --- **高效学习闭环**:分类训练 → 暴露弱点 → 错分析 → 针对性补强 → 重验证 **引用验证**:按型梯度训练比随机效率提升3倍以上(引用[1]),排序算法掌握度直接影响面试通过率(引用[2])。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小范好好学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值