👉 推荐 在线阅读 (Github在国内访问经常不稳定)
👉 推荐 Gitee同步
- 介绍 :本项目是一套完整的刷题计划,旨在帮助大家少走弯路,循序渐进学算法,关注作者
- 正式出版 :《代码随想录》 。
- PDF版本 :「代码随想录」算法精讲 PDF 版本 。
- 算法公开课 :《代码随想录》算法视频公开课 。
- 最强八股文 :代码随想录知识星球精华PDF 。
- 刷题顺序 :README已经将刷题顺序排好了,按照顺序一道一道刷就可以。
- 学习社区 :一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入「代码随想录」知识星球 。
- 提交代码 :本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢这里的每一位贡献者,如果你也想贡献代码点亮你的头像,点击这里了解提交代码的方式。
- 转载须知 :以下所有文章皆为我(程序员Carl)的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!
很多刚开始刷题的同学都有一个困惑:面对leetcode上近两千道题目,从何刷起。
大家平时刷题感觉效率低,浪费的时间主要在三点:
- 找题
- 找到了不应该现阶段做的题
- 没有全套的优质题解可以参考
其实我之前在知乎上回答过这个问题,回答内容大概是按照如下类型来刷数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构,再从简单刷起,做了几个类型题目之后,再慢慢做中等题目、困难题目。
但我能设身处地的感受到:即使有这样一个整体规划,对于一位初学者甚至算法老手寻找合适自己的题目也是很困难,时间成本很高,而且题目还不一定就是经典题目。
对于刷题,我们都是想用最短的时间按照循序渐进的难度顺序把经典题目都做一遍,这样效率才是最高的!
所以我整理了leetcode刷题攻略:一个超级详细的刷题顺序,每道题目都是我精心筛选,都是经典题目高频面试题,大家只要按照这个顺序刷就可以了,你没看错,README已经把题目顺序都排好了,文章顺序就是刷题顺序!挨个刷就可以,不用自己再去题海里选题了!
而且每道题目我都写了的详细题解(图文并茂,难点配有视频),力扣上我的题解都是排在对应题目的首页,质量是有目共睹的。
那么现在我把刷题顺序都整理出来,是为了帮助更多的学习算法的同学少走弯路!
如果你在刷leetcode,强烈建议先按照本攻略刷题顺序来刷,刷完了你会发现对整个知识体系有一个质的飞跃,不用在题海茫然的寻找方向。
按照先面的排列顺序,从数组开始刷起就可以了,顺序都安排好了,按顺序刷就好。
在刷题攻略中,每个专题开始都有理论基础篇,并不像是教科书般的理论介绍,而是从实战中归纳需要的基础知识。每个专题结束都有总结篇,最这个专题的归纳总结。
如果你是算法老手,这篇攻略也是复习的最佳资料,如果把每个系列对应的总结篇,快速过一遍,整个算法知识体系以及各种解法就重现脑海了。
这里每一篇题解,都是精品,值得仔细琢磨。
我在题目讲解中统一使用C++,但你会发现下面几乎每篇题解都配有其他语言版本,Java、Python、Go、JavaScript等等,正是这些热心小伙们贡献的代码,当然我也会严格把控代码质量。
所以也欢迎大家参与进来,完善题解的各个语言版本,拥抱开源,让更多小伙伴们受益。
准备好了么,刷题攻略开始咯,go go go!
-
编程语言
-
工具
-
求职
-
算法性能分析
- 数组过于简单,但你该了解这些!
- 数组:704.二分查找
- 数组:27.移除元素
- 数组:977.有序数组的平方
- 数组:209.长度最小的子数组
- 数组:区间和
- 数组:开发商购买土地
- 数组:59.螺旋矩阵II
- 数组:总结篇
- 关于链表,你该了解这些!
- 链表:203.移除链表元素
- 链表:707.设计链表
- 链表:206.翻转链表
- 链表:24.两两交换链表中的节点
- 链表:19.删除链表的倒数第 N 个结点
- 链表:链表相交
- 链表:142.环形链表
- 链表:总结篇!
- 关于哈希表,你该了解这些!
- 哈希表:242.有效的字母异位词
- 哈希表:1002.查找常用字符
- 哈希表:349.两个数组的交集
- 哈希表:202.快乐数
- 哈希表:1.两数之和
- 哈希表:454.四数相加II
- 哈希表:383.赎金信
- 哈希表:15.三数之和
- 双指针法:18.四数之和
- 哈希表:总结篇!
- 字符串:344.反转字符串
- 字符串:541.反转字符串II
- 字符串:替换数字
- 字符串:151.翻转字符串里的单词
- 字符串:右旋字符串
- 帮你把KMP算法学个通透
- 字符串:459.重复的子字符串
- 字符串:总结篇!
双指针法基本都是应用在数组,字符串与链表的题目上
- 数组:27.移除元素
- 字符串:344.反转字符串
- 字符串:替换数字
- 字符串:151.翻转字符串里的单词
- 链表:206.翻转链表
- 链表:19.删除链表的倒数第 N 个结点
- 链表:链表相交
- 链表:142.环形链表
- 双指针:15.三数之和
- 双指针:18.四数之和
- 双指针:总结篇!
- 栈与队列:理论基础
- 栈与队列:232.用栈实现队列
- 栈与队列:225.用队列实现栈
- 栈与队列:20.有效的括号
- 栈与队列:1047.删除字符串中的所有相邻重复项
- 栈与队列:150.逆波兰表达式求值
- 栈与队列:239.滑动窗口最大值
- 栈与队列:347.前K个高频元素
- 栈与队列:总结篇!
- 关于二叉树,你该了解这些!
- 二叉树:二叉树的递归遍历
- 二叉树:二叉树的迭代遍历
- 二叉树:二叉树的统一迭代法
- 二叉树:二叉树的层序遍历
- 二叉树:226.翻转二叉树
- 本周小结!(二叉树)
- 二叉树:101.对称二叉树
- 二叉树:104.二叉树的最大深度
- 二叉树:111.二叉树的最小深度
- 二叉树:222.完全二叉树的节点个数
- 二叉树:110.平衡二叉树
- 二叉树:257.二叉树的所有路径
- 本周总结!(二叉树)
- 二叉树:404.左叶子之和
- 二叉树:513.找树左下角的值
- 二叉树:112.路径总和
- 二叉树:106.构造二叉树
- 二叉树:654.最大二叉树
- 本周小结!(二叉树)
- 二叉树:617.合并两个二叉树
- 二叉树:700.二叉搜索树登场!
- 二叉树:98.验证二叉搜索树
- 二叉树:530.搜索树的最小绝对差
- 二叉树:501.二叉搜索树中的众数
- 二叉树:236.公共祖先问题
- 本周小结!(二叉树)
- 二叉树:235.搜索树的最近公共祖先
- 二叉树:701.搜索树中的插入操作
- 二叉树:450.搜索树中的删除操作
- 二叉树:669.修剪二叉搜索树
- 二叉树:108.将有序数组转换为二叉搜索树
- 二叉树:538.把二叉搜索树转换为累加树
- 二叉树:总结篇!(需要掌握的二叉树技能都在这里了)
题目分类大纲如下:
- 关于回溯算法,你该了解这些!
- 回溯算法:77.组合
- 回溯算法:77.组合优化
- 回溯算法:216.组合总和III
- 回溯算法:17.电话号码的字母组合
- 本周小结!(回溯算法系列一)
- 回溯算法:39.组合总和
- 回溯算法:40.组合总和II
- 回溯算法:131.分割回文串
- 回溯算法:93.复原IP地址
- 回溯算法:78.子集
- 本周小结!(回溯算法系列二)
- 回溯算法:90.子集II
- 回溯算法:491.递增子序列
- 回溯算法:46.全排列
- 回溯算法:47.全排列II
- 本周小结!(回溯算法系列三)
- 回溯算法去重问题的另一种写法
- 回溯算法:332.重新安排行程
- 回溯算法:51.N皇后
- 回溯算法:37.解数独
- 回溯算法总结篇
题目分类大纲如下:
- 关于贪心算法,你该了解这些!
- 贪心算法:455.分发饼干
- 贪心算法:376.摆动序列
- 贪心算法:53.最大子序和
- 本周小结!(贪心算法系列一)
- 贪心算法:122.买卖股票的最佳时机II
- 贪心算法:55.跳跃游戏
- 贪心算法:45.跳跃游戏II
- 贪心算法:1005.K次取反后最大化的数组和
- 本周小结!(贪心算法系列二)
- 贪心算法:134.加油站
- 贪心算法:135.分发糖果
- 贪心算法:860.柠檬水找零
- 贪心算法:406.根据身高重建队列
- 本周小结!(贪心算法系列三)
- 贪心算法:406.根据身高重建队列(续集)
- 贪心算法:452.用最少数量的箭引爆气球
- 贪心算法:435.无重叠区间
- 贪心算法:763.划分字母区间
- 贪心算法:56.合并区间
- 本周小结!(贪心算法系列四)
- 贪心算法:738.单调递增的数字
- 贪心算法:968.监控二叉树
- 贪心算法:总结篇!(每逢总结必经典)
动态规划专题已经开始啦,来不及解释了,小伙伴们上车别掉队!
- 关于动态规划,你该了解这些!
- 动态规划:509.斐波那契数
- 动态规划:70.爬楼梯
- 动态规划:746.使用最小花费爬楼梯
- 本周小结!(动态规划系列一)
- 动态规划:62.不同路径
- 动态规划:63.不同路径II
- 动态规划:343.整数拆分
- 动态规划:96.不同的二叉搜索树
- 本周小结!(动态规划系列二)
背包问题系列:
- 动态规划:01背包理论基础
- 动态规划:01背包理论基础(滚动数组)
- 动态规划:416.分割等和子集
- 动态规划:1049.最后一块石头的重量II
- 本周小结!(动态规划系列三)
- 动态规划:494.目标和
- 动态规划:474.一和零
- 动态规划:完全背包总结篇
- 动态规划:518.零钱兑换II
- 本周小结!(动态规划系列四)
- 动态规划:377.组合总和Ⅳ
- 动态规划:70.爬楼梯(完全背包版本)
- 动态规划:322.零钱兑换
- 动态规划:279.完全平方数
- 本周小结!(动态规划系列五)
- 动态规划:139.单词拆分
- 动态规划:多重背包理论基础
- 背包问题总结篇
打家劫舍系列:
股票系列:
- 动态规划:121.买卖股票的最佳时机
- 动态规划:本周小结(系列六)
- 动态规划:122.买卖股票的最佳时机II
- 动态规划:123.买卖股票的最佳时机III
- 动态规划:188.买卖股票的最佳时机IV
- 动态规划:309.最佳买卖股票时机含冷冻期
- 动态规划:本周小结(系列七)
- 动态规划:714.买卖股票的最佳时机含手续费
- 动态规划:股票系列总结篇
子序列系列:
- 动态规划:300.最长递增子序列
- 动态规划:674.最长连续递增序列
- 动态规划:718.最长重复子数组
- 动态规划:1143.最长公共子序列
- 动态规划:1035.不相交的线
- 动态规划:53.最大子序和
- 动态规划:392.判断子序列
- 动态规划:115.不同的子序列
- 动态规划:583.两个字符串的删除操作
- 动态规划:72.编辑距离
- 编辑距离总结篇
- 动态规划:647.回文子串
- 动态规划:516.最长回文子序列
- 动态规划总结篇
- 图论:理论基础
- 图论:深度优先搜索理论基础
- 图论:所有可达路径
- 图论:广度优先搜索理论基础
- 图论:岛屿数量.深搜版
- 图论:岛屿数量.广搜版
- 图论:岛屿的最大面积
- 图论:孤岛的总面积
- 图论:沉没孤岛
- 图论:水流问题
- 图论:建造最大岛屿
- 图论:字符串接龙
- 图论:有向图的完全可达性
- 图论:岛屿的周长
- 图论:并查集理论基础
- 图论:寻找存在的路径
- 图论:冗余连接
- 图论:冗余连接II
- 图论:最小生成树之prim
- 图论:最小生成树之kruskal
- 图论:拓扑排序
- 图论:dijkstra(朴素版)
- 图论:dijkstra(堆优化版)
- 图论:Bellman_ford 算法
- 图论:Bellman_ford 队列优化算法(又名SPFA)
- 图论:Bellman_ford之判断负权回路
- 图论:Bellman_ford之单源有限最短路
- 图论:Floyd 算法
- 图论:A * 算法
- 图论:最短路算法总结篇
- 图论:图论总结篇
(持续更新中....)
- 并查集
- 最小生成树
- 线段树
- 树状数组
- 字典树
以上题目是重中之重,大家至少要刷两遍以上才能彻底理解,如果熟练以上题目之后还在找其他题目练手,可以再刷以下题目:
这些题目很不错,但有的题目是和刷题攻略类似的,有的题解后面还会适当补充,所以我还没有将其纳入到刷题攻略。一些题解等日后我完善一下,再纳入到刷题攻略。
- 1365.有多少小于当前数字的数字
- 941.有效的山脉数组 (双指针)
- 1207.独一无二的出现次数 数组在哈希法中的经典应用
- 283.移动零 【数组】【双指针】
- 189.旋转数组
- 724.寻找数组的中心索引
- 34.在排序数组中查找元素的第一个和最后一个位置 (二分法)
- 922.按奇偶排序数组II
- 35.搜索插入位置
- 24.两两交换链表中的节点
- 234.回文链表
- 143.重排链表【数组】【双向队列】【直接操作链表】
- 141.环形链表
- 160.相交链表
- 205.同构字符串:【哈希表的应用】
- 925.长按键入 模拟匹配
- 0844.比较含退格的字符串【栈模拟】【空间更优的双指针】
- 129.求根到叶子节点数字之和
- 1382.将二叉搜索树变平衡 构造平衡二叉搜索树
- 100.相同的树 同101.对称二叉树 一个思路
- 116.填充每个节点的下一个右侧节点指针
- 649.Dota2参议院 有难度
- 1221.分割平衡字符 简单贪心
- 5.最长回文子串 和647.回文子串 差不多是一样的
- 132.分割回文串II 与647.回文子串和 5.最长回文子串 很像
- 673.最长递增子序列的个数
- 684.冗余连接 【并查集基础题目】
- 685.冗余连接II【并查集的应用】
点此这里查看LeetCode-Master的所有贡献者。感谢他们补充了LeetCode-Master的其他语言版本,让更多的读者受益于此项目。
大家好,我是程序员Carl,哈工大师兄,《代码随想录》作者,先后在腾讯和百度从事后端技术底层技术研发。
添加如下企业微信,会自动发送给大家PDF版本,顺便可以选择是否加入刷题群。
添加微信记得备注,如果是已工作,备注:姓名-城市-岗位。如果学生,备注:姓名-学校-年级。备注没有自我介绍不通过哦