English version repo and Gitbook is on [english branch](https://github.com/labuladong/fucking-algorithm/tree/english). Just enjoy:) # labuladong 的算法小抄

Website GitHub

![](pictures/souyisou.png) 好消息,《labuladong 的算法小抄》纸质书出版啦!关注公众号查看详情👆 [![Star History Chart](https://api.star-history.com/svg?repos=labuladong/fucking-algorithm&type=Date)](https://star-history.com/#labuladong/fucking-algorithm&Date) 本仓库总共 60 多篇原创文章,都是基于 LeetCode 的题目,涵盖了所有题型和技巧,而且一定要做到**举一反三,通俗易懂**,绝不是简单的代码堆砌,后面有目录。 我先吐槽几句。**刷题刷题,刷的是题,培养的是思维,本仓库的目的就是传递这种算法思维**。我要是只写一个包含 LeetCode 题目代码的仓库,有个锤子用?没有思路解释,没有思维框架,顶多写个时间复杂度,那玩意一眼就能看出来。 只想要答案的话很容易,题目评论区五花八门的答案,动不动就秀 python 一行代码解决,有那么多人点赞。问题是,你去做算法题,是去学习编程语言的奇技淫巧的,还是学习算法思维的呢?你的快乐,到底源自复制别人的一行代码通过测试,已完成题目 +1,还是源自自己通过逻辑推理和算法框架不看答案写出解法? 网上总有大佬喷我,说我写的东西太基础,要么说不能借助框架思维来学习算法。我只能说大家刷算法就是找工作吃饭的,不是打竞赛的,我也是一路摸爬滚打过来的,我们要的是清楚明白有所得,不是故弄玄虚无所指。 不想办法做到通俗易懂,难道要上来先把《算法导论》吹上天,然后把人家都心怀敬仰地劝退? **做啥事情做多了,都能发现套路的,我把各种算法套路框架总结出来,相信可以帮助其他人少走弯路**。我这个纯靠自学的小童鞋,花了一年时间刷题和总结,自己写了一份算法小抄,后面有目录,这里就不废话了。 ### 使用方法 **1、先给本仓库点个 star,满足一下我的虚荣心**,文章质量绝对值你一个 star。我还在继续创作,给我一点继续写文的动力,感谢。 **2、建议关注我的公众号 labuladong,坚持高质量原创,说是最良心最硬核的技术公众号都不为过**。本仓库的文章就是从公众号里整理出来的**一部分**内容,公众号可以查看更多内容:

**3、建议收藏我的在线网站,每篇文章开头都有对应的力扣题目链接,可以边看文章边刷题,一共可以手把手带你刷 300 道题目**: GitHub Pages 地址:https://labuladong.github.io/algo/ Gitee Pages 地址:https://labuladong.gitee.io/algo/ **4、我的教程已经制作成了《算法秘籍》和《刷题笔记》两本 PDF 教材,[点这里](https://mp.weixin.qq.com/s/X-fE9sR4BLi6T9pn7xP4pg) 查看。另外建议关注 [我的 B 站](https://space.bilibili.com/14089380),我把一系列核心算法技巧都录制成了视频,方便大家学习**。 **5、我开发了一系列配套插件辅助大家学习算法,覆盖各个使用场景**: 首先是我的 [Chrome 刷题插件](https://mp.weixin.qq.com/s/wIxflO1dvXzDlibhEcENcQ),方便在网页上刷题的读者,功能如下图: ![](./pictures/plugin/chrome.jpg) ![](./pictures/plugin/chrome.gif) 如果不喜欢在网页刷题,可以安装我的 [vscode 刷题插件](https://mp.weixin.qq.com/s/z4mqiiJV9pZ3t6SIPa2kTA),功能如下图: ![](./pictures/plugin/vscode.jpg) ![](./pictures/plugin/vscode.gif) 或者,也可以安装我的 [JetBrains 刷题插件](https://mp.weixin.qq.com/s/NF8mmVyXVfC1ehdMOsO7Cw),功能如下图: ![](./pictures/plugin/jetbrain.jpg) ![](./pictures/plugin/jetbrain.gif) **可以说,我把内容和配套工具全都做好了,你只要按部就班顺着我的教程学习,就可以获得沉浸式的学习体验。这是教程及工具链使用手册的入口**: ![](./pictures/plugin/%E5%85%A8%E5%AE%B6%E6%A1%B6.jpg) 其他的先不多说了,直接上干货吧,我们一起搞定 LeetCode,感受一下支配算法的乐趣。 # 目录 ### [第零章、核心框架汇总](https://labuladong.github.io/algo/) * [学习算法和刷题的框架思维](https://labuladong.github.io/article/fname.html?fname=学习数据结构和算法的高效方法) * [我的刷题心得](https://labuladong.github.io/article/fname.html?fname=算法心得) * [双指针技巧秒杀七道链表题目](https://labuladong.github.io/article/fname.html?fname=链表技巧) * [双指针技巧秒杀七道数组题目](https://labuladong.github.io/article/fname.html?fname=双指针技巧) * [东哥带你刷二叉树(纲领篇)](https://labuladong.github.io/article/fname.html?fname=二叉树总结) * [动态规划解题套路框架](https://labuladong.github.io/article/fname.html?fname=动态规划详解进阶) * [回溯算法解题套路框架](https://labuladong.github.io/article/fname.html?fname=回溯算法详解修订版) * [回溯算法秒杀所有排列/组合/子集问题](https://labuladong.github.io/article/fname.html?fname=子集排列组合) * [BFS 算法解题套路框架](https://labuladong.github.io/article/fname.html?fname=BFS框架) * [我写了首诗,把二分搜索算法变成了默写题](https://labuladong.github.io/article/fname.html?fname=二分查找详解) * [我写了首诗,把滑动窗口算法变成了默写题](https://labuladong.github.io/article/fname.html?fname=滑动窗口技巧进阶) * [一个方法团灭 LeetCode 股票买卖问题](https://labuladong.github.io/article/fname.html?fname=团灭股票问题) * [一个方法团灭 LeetCode 打家劫舍问题](https://labuladong.github.io/article/fname.html?fname=抢房子) * [一个方法团灭 nSum 问题](https://labuladong.github.io/article/fname.html?fname=nSum) * [算法时空复杂度分析实用指南](https://labuladong.github.io/article/fname.html?fname=时间复杂度) * [算法笔试「骗分」套路](https://labuladong.github.io/article/fname.html?fname=刷题技巧) ### [第一章、手把手刷数据结构](https://labuladong.github.io/algo/) * [手把手刷链表算法](https://labuladong.github.io/algo/) * [双指针技巧秒杀七道链表题目](https://labuladong.github.io/article/fname.html?fname=链表技巧) * [递归魔法:反转单链表](https://labuladong.github.io/article/fname.html?fname=递归反转链表的一部分) * [如何 K 个一组反转链表](https://labuladong.github.io/article/fname.html?fname=k个一组反转链表) * [如何判断回文链表](https://labuladong.github.io/article/fname.html?fname=判断回文链表) * [手把手刷数组算法](https://labuladong.github.io/algo/) * [双指针技巧秒杀七道数组题目](https://labuladong.github.io/article/fname.html?fname=双指针技巧) * [小而美的算法技巧:前缀和数组](https://labuladong.github.io/article/fname.html?fname=前缀和技巧) * [小而美的算法技巧:差分数组](https://labuladong.github.io/article/fname.html?fname=差分技巧) * [二维数组的花式遍历技巧](https://labuladong.github.io/article/fname.html?fname=花式遍历) * [我写了首诗,把滑动窗口算法算法变成了默写题](https://labuladong.github.io/article/fname.html?fname=滑动窗口技巧进阶) * [滑动窗口算法延伸:Rabin Karp 字符匹配算法](https://labuladong.github.io/article/fname.html?fname=rabinkarp) * [我写了首诗,让你闭着眼睛也能写对二分搜索](https://labuladong.github.io/article/fname.html?fname=二分查找详解) * [带权重的随机选择算法](https://labuladong.github.io/article/fname.html?fname=随机权重) * [二分搜索怎么用?我又总结了套路](https://labuladong.github.io/article/fname.html?fname=二分运用) * [田忌赛马背后的算法决策](https://labuladong.github.io/article/fname.html?fname=田忌赛马) * [常数时间删除/查找数组中的任意元素](https://labuladong.github.io/article/fname.html?fname=随机集合) * [一道数组去重的算法题把我整不会了](https://labuladong.github.io/article/fname.html?fname=单调栈去重) * [手把手刷二叉树算法](https://labuladong.github.io/algo/) * [东哥带你刷二叉树(纲领篇)](https://labuladong.github.io/article/fname.html?fname=二叉树总结) * [东哥带你刷二叉树(思路篇)](https://labuladong.github.io/article/fname.html?fname=二叉树系列1) * [东哥带你刷二叉树(构造篇)](https://labuladong.github.io/article/fname.html?fname=二叉树系列2) * [东哥带你刷二叉树(序列化篇)](https://labuladong.github.io/article/fname.html?fname=二叉树的序列化) * [东哥带你刷二叉树(后序篇)](https://labuladong.github.io/article/fname.html?fname=二叉树系列3) * [归并排序详解及应用](https://labuladong.github.io/article/fname.html?fname=归并排序) * [东哥带你刷二叉搜索树(特性篇)](https://labuladong.github.io/article/fname.html?fname=BST1) * [东哥带你刷二叉搜索树(基操篇)](https://labuladong.github.io/article/fname.html?fname=BST2) * [东哥带你刷二叉搜索树(构造篇)](https://labuladong.github.io/article/fname.html?fname=BST3) * [快速排序详解及应用](https://labuladong.github.io/article/fname.html?fname=快速排序) * [题目不让我干什么,我偏要干什么](https://labuladong.github.io/article/fname.html?fname=nestInteger) * [Git原理之最近公共祖先](https://labuladong.github.io/article/fname.html?fname=公共祖先) * [如何计算完全二叉树的节点数](https://labuladong.github.io/article/fname.html?fname=完全二叉树节点数) * [手把手刷图算法](https://labuladong.github.io/algo/) * [图论基础及遍历算法](https://labuladong.github.io/article/fname.html?fname=图) * [环检测及拓扑排序算法](https://labuladong.github.io/article/fname.html?fname=拓扑排序) * [二分图判定算法](https://labuladong.github.io/article/fname.html?fname=二分图) * [并查集(Union-Find)算法](https://labuladong.github.io/article/fname.html?fname=UnionFind算法详解) * [Kruskal 最小生成树算法](https://labuladong.github.io/article/fname.html?fname=kruskal) * [Prim 最小生成树算法](https://labuladong.github.io/article/fname.html?fname=prim算法) * [Dijkstra 算法模板及应用](https://labuladong.github.io/article/fname.html?fname=dijkstra算法) * [众里寻他千百度:名流问题](https://labuladong.github.io/article/fname.html?fname=名人问题) * [手把手设计数据结构](https://labuladong.github.io/algo/) * [算法就像搭乐高:带你手撸 LRU 算法](https://labuladong.github.io/article/fname.html?fname=LRU算法) * [算法就像搭乐高:带你手撸 LFU 算法](https://labuladong.github.io/article/fname.html?fname=LFU) * [前缀树算法模板秒杀五道算法题](https://labuladong.github.io/article/fname.html?fname=trie) * [一道求中位数的算法题把我整不会了](https://labuladong.github.io/article/fname.html?fname=数据流中位数) * [单调栈结构解决三道算法题](https://labuladong.github.io/article/fname.html?fname=单调栈) * [单调队列结构解决滑动窗口问题](https://labuladong.github.io/article/fname.html?fname=单调队列) * [二叉堆详解实现优先级队列](https://labuladong.github.io/article/fname.html?fname=二叉堆详解实现优先级队列) * [队列实现栈以及栈实现队列](https://labuladong.github.io/article/fname.html?fname=队列实现栈栈实现队列) * [设计朋友圈时间线功能](https://labuladong.github.io/article/fname.html?fname=设计Twitter) ### [第二章、手把手刷动态规划](https://labuladong.github.io/algo/) * [动态规划基本技巧](https://labuladong.github.io/algo/) * [动态规划解题套路框架](https://labuladong.github.io/article/fname.html?fname=动态规划详解进阶) * [动态规划设计:最长递增子序列](https://labuladong.github.io/article/fname.html?fname=动态规划设计:最长递增子序列) * [最优子结构原理和 dp 数组遍历方向](https://labuladong.github.io/article/fname.html?fname=最优子结构) * [base case 和备忘录的初始值怎么定?](https://labuladong.github.io/article/fname.html?fname=备忘录等基础) * [对动态规划进行降维打击](https://labuladong.github.io/article/fname.html?fname=状态压缩技巧) * [子序列类型问题](https://labuladong.github.io/algo/) * [经典动态规划:编辑距离](https://labuladong.github.io/article/fname.html?fname=编辑距离) * [动态规划设计:最长递增子序列](https://labuladong.github.io/article/fname.html?fname=动态规划设计:最长递增子序列) * [动态规划设计:最大子数组](https://labuladong.github.io/article/fname.html?fname=最大子数组) * [经典动态规划:最长公共子序列](https://labuladong.github.io/article/fname.html?fname=LCS) * [动态规划之子序列问题解题模板](https://labuladong.github.io/article/fname.html?fname=子序列问题模板) * [背包类型问题](https://labuladong.github.io/algo/) * [经典动态规划:0-1 背包问题](https://labuladong.github.io/article/fname.html?fname=背包问题) * [经典动态规划:子集背包问题](https://labuladong.github.io/article/fname.html?fname=背包子集) * [经典动态规划:完全背包问题](https://labuladong.github.io/article/fname.html?fname=背包零钱) * [动态规划和回溯算法到底谁是谁爹?](https://labuladong.github.io/article/fname.html?fname=targetSum) * [用动态规划玩游戏](https://labuladong.github.io/algo/) * [动态规划之最小路径和](https://labuladong.github.io/article/fname.html?fname=最小路径和) * [动态规划帮我通关了《魔塔》](https://labuladong.github.io/article/fname.html?fname=魔塔) * [动态规划帮我通关了《辐射4》](https://labuladong.github.io/article/fname.html?fname=转盘) * [旅游省钱大法:加权最短路径](https://labuladong.github.io/article/fname.html?fname=旅行最短路径) * [经典动态规划:正则表达式](https://labuladong.github.io/article/fname.html?fname=动态规划之正则表达) * [经典动态规划:高楼扔鸡蛋](https://labuladong.github.io/article/fname.html?fname=高楼扔鸡蛋问题) * [经典动态规划:戳气球](https://labuladong.github.io/article/fname.html?fname=扎气球) * [经典动态规划:博弈问题](https://labuladong.github.io/article/fname.html?fname=动态规划之博弈问题) * [经典动态规划:四键键盘](https://labuladong.github.io/article/fname.html?fname=动态规划之四键键盘) * [一个方法团灭 LeetCode 打家劫舍问题](https://labuladong.github.io/article/fname.html?fname=抢房子) * [一个方法团灭 LeetCode 股票买卖问题](https://labuladong.github.io/article/fname.html?fname=团灭股票问题) * [有限状态机之 KMP 字符匹配算法](https://labuladong.github.io/article/fname.html?fname=动态规划之KMP字符匹配算法) * [贪心类型问题](https://labuladong.github.io/algo/) * [贪心算法之区间调度问题](https://labuladong.github.io/article/fname.html?fname=贪心算法之区间调度问题) * [扫描线技巧:安排会议室](https://labuladong.github.io/article/fname.html?fname=安排会议室) * [剪视频剪出一个贪心算法](https://labuladong.github.io/article/fname.html?fname=剪视频) * [如何运用贪心思想玩跳跃游戏](https://labuladong.github.io/article/fname.html?fname=跳跃游戏) ### [第三章、必知必会算法技巧](https://labuladong.github.io/algo/) * [暴力搜索算法](https://labuladong.github.io/algo/) * [回溯算法解题套路框架](https://labuladong.github.io/article/fname.html?fname=回溯算法详解修订版) * [经典回溯算法:集合划分问题](https://labuladong.github.io/article/fname.html?fname=集合划分) * [回溯算法秒杀所有排列/组合/子集问题](https://labuladong.github.io/article/fname.html?fname=子集排列组合) * [一文秒杀所有岛屿题目](https://labuladong.github.io/article/fname.html?fname=岛屿题目) * [回溯算法最佳实践:解数独](https://labuladong.github.io/article/fname.html?fname=sudoku) * [回溯算法最佳实践:括号生成](https://labuladong.github.io/article/fname.html?fname=合法括号生成) * [BFS 算法解题套路框架](https://labuladong.github.io/article/fname.html?fname=BFS框架) * [如何用 BFS 算法秒杀各种智力题](https://labuladong.github.io/article/fname.html?fname=BFS解决滑动拼图) * [数学运算技巧](https://labuladong.github.io/algo/) * [谈谈游戏中的随机算法](https://labuladong.github.io/article/fname.html?fname=随机算法) * [常用的位操作](https://labuladong.github.io/article/fname.html?fname=常用的位操作) * [讲两道常考的阶乘算法题](https://labuladong.github.io/article/fname.html?fname=阶乘题目) * [如何高效寻找素数](https://labuladong.github.io/article/fname.html?fname=打印素数) * [如何高效进行模幂运算](https://labuladong.github.io/article/fname.html?fname=superPower) * [如何同时寻找缺失和重复的元素](https://labuladong.github.io/article/fname.html?fname=缺失和重复的元素) * [一行代码就能解决的算法题](https://labuladong.github.io/article/fname.html?fname=一行代码解决的智力题) * [几个反直觉的概率问题](https://labuladong.github.io/article/fname.html?fname=几个反直觉的概率问题) * [经典面试题](https://labuladong.github.io/algo/) * [分治算法详解:运算优先级](https://labuladong.github.io/article/fname.html?fname=分治算法) * [一个方法解决三道区间问题](https://labuladong.github.io/article/fname.html?fname=区间问题合集) * [谁能想到,斗地主也能玩出算法](https://labuladong.github.io/article/fname.html?fname=斗地主) * [烧饼排序算法](https://labuladong.github.io/article/fname.html?fname=烧饼排序) * [字符串乘法计算](https://labuladong.github.io/article/fname.html?fname=字符串乘法) * [如何实现一个计算器](https://labuladong.github.io/article/fname.html?fname=实现计算器) * [如何高效解决接雨水问题](https://labuladong.github.io/article/fname.html?fname=接雨水) * [如何解决括号相关的问题](https://labuladong.github.io/article/fname.html?fname=括号插入) * [如何判定完美矩形](https://labuladong.github.io/article/fname.html?fname=完美矩形) * [如何调度考生的座位](https://labuladong.github.io/article/fname.html?fname=座位调度) * [二分查找高效判定子序列](https://labuladong.github.io/article/fname.html?fname=二分查找判定子序列) ### [第四章、通用计算机技术](https://labuladong.github.io/algo/) * [Linux 文件系统都是什么鬼](https://labuladong.github.io/article/fname.html?fname=linux文件系统) * [Linux 的进程/线程/文件描述符是什么](https://labuladong.github.io/article/fname.html?fname=linux进程) * [关于 Linux shell 你必须知道的](https://labuladong.github.io/article/fname.html?fname=linuxshell) * [Linux 管道和重定向的坑](https://labuladong.github.io/article/fname.html?fname=linux技巧3) * [一文看懂 session 和 cookie](https://labuladong.github.io/article/fname.html?fname=session和cookie) * [加密算法的前身今世](https://labuladong.github.io/article/fname.html?fname=密码技术) * [我用四个命令概括了 Git 的所有套路](https://labuladong.github.io/article/fname.html?fname=git常用命令) * [Git/SQL/正则表达式的在线练习平台](https://labuladong.github.io/article/fname.html?fname=在线练习平台) * [消息队列架构设计演进](https://labuladong.github.io/article/fname.html?fname=消息队列) * [存储系统设计之 LSM 树原理](https://labuladong.github.io/article/fname.html?fname=LSM树) * [用消息队列制作一款多人在线游戏](https://labuladong.github.io/article/fname.html?fname=炸弹人游戏) * [拥抱开源,告别 CRUD](https://labuladong.github.io/article/fname.html?fname=参与开源) # 感谢如下大佬参与翻译 按照昵称字典序排名: [ABCpril](https://github.com/ABCpril), [andavid](https://github.com/andavid), [bryceustc](https://github.com/bryceustc), [build2645](https://github.com/build2645), [CarrieOn](https://github.com/CarrieOn), [cooker](https://github.com/xiaochuhub), [Dong Wang](https://github.com/Coder2Programmer), [ExcaliburEX](https://github.com/ExcaliburEX), [floatLig](https://github.com/floatLig), [ForeverSolar](https://github.com/foreversolar), [Fulin Li](https://fulinli.github.io/), [Funnyyanne](https://github.com/Funnyyanne), [GYHHAHA](https://github.com/GYHHAHA), [Hi_archer](https://hiarcher.top/), [Iruze](https://github.com/Iruze), [Jieyixia](https://github.com/Jieyixia), [Justin](https://github.com/Justin-YGG), [Kevin](https://github.com/Kevin-free), [Lrc123](https://github.com/Lrc123), [lriy](https://github.com/lriy), [Lyjeeq](https://github.com/Lyjeeq), [MasonShu](https://greenwichmt.github.io/), [Master-cai](https://github.com/Master-cai), [miaoxiaozui2017](https://github.com/miaoxiaozui2017), [natsunoyoru97](https://github.com/natsunoyoru97), [nettee](https://github.com/nettee), [PaperJets](https://github.com/PaperJets), [qy-yang](https://github.com/qy-yang), [realism0331](https://github.com/realism0331), [SCUhzs](https://github.com/brucecat), [Seaworth](https://github.com/Seaworth), [shazi4399](https://github.com/shazi4399), [ShuozheLi](https://github.com/ShuoZheLi/), [sinjoywong](https://blog.csdn.net/SinjoyWong), [sunqiuming526](https://github.com/sunqiuming526), [Tianhao Zhou](https://github.com/tianhaoz95), [timmmGZ](https://github.com/timmmGZ), [tommytim0515](https://github.com/tommytim0515), [ucsk](https://github.com/ucsk), [wadegrc](https://github.com/wadegrc), [walsvid](https://github.com/walsvid), [warmingkkk](https://github.com/warmingkkk), [Wonderxie](https://github.com/Wonderxie), [wsyzxxxx](https://github.com/wsyzxxxx), [xiaodp](https://github.com/xiaodp), [youyun](https://github.com/youyun), [yx-tan](https://github.com/yx-tan), [Zero](https://github.com/Mr2er0), [Ziming](https://github.com/ML-ZimingMeng/LeetCode-Python3) # Donate 如果本仓库对你有帮助,可以请作者喝杯速溶咖啡