English version is on labuladong.online too. Just enjoy:)
labuladong 的算法笔记
本仓库总共 60 多篇原创文章,都是基于 LeetCode 的题目,涵盖了所有题型和技巧,而且一定要做到举一反三,通俗易懂,绝不是简单的代码堆砌,后面有目录。
我先吐槽几句。刷题刷题,刷的是题,培养的是思维,本仓库的目的就是传递这种算法思维。我要是只写一个包含 LeetCode 题目代码的仓库,有个锤子用?没有思路解释,没有思维框架,顶多写个时间复杂度,那玩意一眼就能看出来。
只想要答案的话很容易,题目评论区五花八门的答案,动不动就秀 python 一行代码解决,有那么多人点赞。问题是,你去做算法题,是去学习编程语言的奇技淫巧的,还是学习算法思维的呢?你的快乐,到底源自复制别人的一行代码通过测试,已完成题目 +1,还是源自自己通过逻辑推理和算法框架不看答案写出解法?
网上总有大佬喷我,说我写的东西太基础,要么说不能借助框架思维来学习算法。我只能说大家刷算法就是找工作吃饭的,不是打竞赛的,我也是一路摸爬滚打过来的,我们要的是清楚明白有所得,不是故弄玄虚无所指。
不想办法做到通俗易懂,难道要上来先把《算法导论》吹上天,然后把人家都心怀敬仰地劝退?
做啥事情做多了,都能发现套路的,我把各种算法套路框架总结出来,相信可以帮助其他人少走弯路。我这个纯靠自学的小童鞋,花了一年时间刷题和总结,自己写了一份算法小抄,后面有目录,这里就不废话了。
在开始学习之前
1、先给本仓库点个 star,满足一下我的虚荣心,文章质量绝对值你一个 star。我还在继续创作,给我一点继续写文的动力,感谢。
2、建议收藏我的在线网站,每篇文章开头都有对应的力扣题目链接,可以边看文章边刷题,一共可以手把手带你刷 500 道题目:
2024 最新地址:https://labuladong.online/algo/
GitHub Pages 地址:https://labuladong.online/algo/
Gitee Pages 地址:https://labuladong.gitee.io/algo/
labuladong 刷题全家桶简介
一、算法可视化面板
我的算法网站、所有配套插件都集成了一个算法可视化工具,可以对数据结构和递归过程进行可视化,大幅降低理解算法的难度。几乎每道题目的解法代码都有对应的可视化面板,具体参见下方介绍。
二、学习网站
内容当然是我的系列算法教程中最核心的部分,我的算法教程都发布在网站 labuladong.online 上,相信你会未来会在这里花费大量的学习时间,而不是仅仅加入收藏夹~

三、Chrome 插件
主要功能:Chrome 插件可以在中文版力扣或英文版 LeetCode 上快捷查看我的「题解」或「思路」,并添加了题目和算法技巧之间的引用关系,可以和我的网站/公众号/课程联动,给我的读者提供最丝滑的刷题体验。安装使用手册见下方目录。

四、vscode 插件
主要功能:和 Chrome 插件功能基本相同,习惯在 vscode 上刷题的读者可以使用该插件。安装使用手册见下方目录。

五、Jetbrains 插件
主要功能:和 Chrome 插件功能基本相同,习惯在 Jetbrains 家的 IDE(PyCharm/Intellij/Goland 等)上刷题的读者可以使用该插件。安装使用手册见下方目录。

最后祝大家学习愉快,在题海中自在遨游!
文章目录
本站简介
配套插件及算法可视化
<a href="https://labuladong.online/algo/intro/chrome/">配套 Chrome 刷题插件</a> 配套 vscode 刷题插件 <a href="https://labuladong.online/algo/intro/jetbrains/">配套 JetBrains 刷题插件</a> 算法可视化面板使用说明 * 本站付费会员
针对初学和速成的学习规划
<a href="https://labuladong.online/algo/intro/how-to-learn-algorithms/">算法刷题的重点和坑</a> 初学者学习规划 <a href="https://labuladong.online/algo/intro/quick-learning-plan/">速成学习规划</a> 习题章节的练习/复习方法 * 算法可视化速查页
入门:编程语言基础及练习
<a href="https://labuladong.online/algo/intro/programming-language-basic/">本章导读</a> C++ 语言基础 <a href="https://labuladong.online/algo/programming-language-basic/java/">Java 语言基础</a> Golang 语言基础 <a href="https://labuladong.online/algo/programming-language-basic/python/">Python 语言基础</a> JavaScript 语言基础 <a href="https://labuladong.online/algo/intro/leetcode/">力扣/LeetCode 解题须知</a> 编程语言刷题实践
基础:数据结构及排序精讲
<a href="https://labuladong.online/algo/intro/data-structure-basic/">本章导读</a> 时间空间复杂度入门
<a href="https://labuladong.online/algo/menu/dynamic-array/">手把手带你实现动态数组</a> 数组(顺序存储)基本原理 * 动态数组代码实现
<a href="https://labuladong.online/algo/menu/linked-list/">手把手带你实现单/双链表</a> 链表(链式存储)基本原理 * 链表代码实现
<a href="https://labuladong.online/algo/menu/queue-stack/">手把手带你实现队列/栈</a> 队列/栈基本原理 <a href="https://labuladong.online/algo/data-structure-basic/linked-queue-stack/">用链表实现队列/栈</a> 环形数组技巧 <a href="https://labuladong.online/algo/data-structure-basic/array-queue-stack/">用数组实现队列/栈</a> 双端队列(Deque)原理及实现
<a href="https://labuladong.online/algo/menu/">哈希表的原理及实现</a> 哈希表核心原理 <a href="https://labuladong.online/algo/data-structure-basic/hashtable-chaining/">用拉链法实现哈希表</a> 线性探查法的两个难点 <a href="https://labuladong.online/algo/data-structure-basic/linear-probing-code/">线性探查法的两种代码实现</a> 哈希集合的原理及代码实现
<a href="https://labuladong.online/algo/menu/">哈希表结构的种种变换</a> 用链表加强哈希表(LinkedHashMap) * 用数组加强哈希表(ArrayHashMap)
<a href="https://labuladong.online/algo/menu/binary-tree/">二叉树结构及遍历</a> 二叉树基础及常见类型 <a href="https://labuladong.online/algo/data-structure-basic/binary-tree-traverse-basic/">二叉树的递归/层序遍历</a> 多叉树的递归/层序遍历
<a href="https://labuladong.online/algo/menu/binary-tree/">二叉树结构的种种变换</a> 二叉搜索树的应用及可视化 <a href="https://labuladong.online/algo/data-structure-basic/rbtree-basic/">红黑树的完美平衡及可视化</a> Trie/字典树/前缀树原理及可视化 <a href="https://labuladong.online/algo/data-structure-basic/binary-heap-basic/">二叉堆核心原理及可视化</a> 二叉堆/优先级队列代码实现 <a href="https://labuladong.online/algo/data-structure-basic/segment-tree-basic/">线段树核心原理及可视化</a> 正在更新 ing
<a href="https://labuladong.online/algo/menu/graph-theory/">图论数据结构及遍历</a> 图结构基础及通用代码实现 <a href="https://labuladong.online/algo/data-structure-basic/graph-traverse-basic/">图结构的 DFS/BFS 遍历</a> Union Find 并查集原理 * 正在更新 ing
<a href="https://labuladong.online/algo/menu/sorting/">十大排序算法原理及可视化</a> 本章导读 <a href="https://labuladong.online/algo/data-structure-basic/sort-basic/">排序算法的关键指标</a> 选择排序所面临的问题 <a href="https://labuladong.online/algo/data-structure-basic/bubble-sort/">拥有稳定性:冒泡排序</a> 运用逆向思维:插入排序 <a href="https://labuladong.online/algo/data-structure-basic/shell-sort/">突破 O(N^2):希尔排序</a> 妙用二叉树前序位置:快速排序 <a href="https://labuladong.online/algo/data-structure-basic/merge-sort/">妙用二叉树后序位置:归并排序</a> 二叉堆结构的运用:堆排序 <a href="https://labuladong.online/algo/data-structure-basic/counting-sort/">全新的排序原理:计数排序</a> 博采众长:桶排序 * 基数排序(Radix Sort)
* 正在更新 ing
第零章、核心刷题框架汇总
<a href="https://labuladong.online/algo/intro/core-intro/">本章导读</a> 学习数据结构和算法的框架思维 <a href="https://labuladong.online/algo/essential-technique/linked-list-skills-summary/">双指针技巧秒杀七道链表题目</a> 双指针技巧秒杀七道数组题目 <a href="https://labuladong.online/algo/essential-technique/sliding-window-framework/">滑动窗口算法核心代码模板</a> 二分搜索算法核心代码模板 <a href="https://labuladong.online/algo/essential-technique/dynamic-programming-framework/">动态规划解题套路框架</a> 回溯算法解题套路框架 <a href="https://labuladong.online/algo/essential-technique/bfs-framework/">BFS 算法解题套路框架</a> 二叉树系列算法核心纲领 <a href="https://labuladong.online/algo/essential-technique/permutation-combination-subset-all-in-one/">回溯算法秒杀所有排列/组合/子集问题</a> 贪心算法解题套路框架 <a href="https://labuladong.online/algo/essential-technique/divide-and-conquer/">分治算法解题套路框架</a> 算法时空复杂度分析实用指南
第一章、经典数据结构算法
<a href="https://labuladong.online/algo/menu/linked-list/">手把手刷链表算法</a> 双指针技巧秒杀七道链表题目 <a href="https://labuladong.online/algo/problem-set/linkedlist-two-pointers/">【强化练习】链表双指针经典习题</a> 单链表的花式反转方法汇总 * 如何判断回文链表
<a href="https://labuladong.online/algo/menu/array/">手把手刷数组算法</a> 双指针技巧秒杀七道数组题目 <a href="https://labuladong.online/algo/practice-in-action/2d-array-traversal-summary/">二维数组的花式遍历技巧</a> 一个方法团灭 nSum 问题 <a href="https://labuladong.online/algo/problem-set/array-two-pointers/">【强化练习】数组双指针经典习题</a> 小而美的算法技巧:前缀和数组 <a href="https://labuladong.online/algo/problem-set/perfix-sum/">【强化练习】前缀和技巧经典习题</a> 小而美的算法技巧:差分数组 <a href="https://labuladong.online/algo/essential-technique/sliding-window-framework/">滑动窗口算法核心代码模板</a> 【强化练习】滑动窗口算法经典习题 <a href="https://labuladong.online/algo/practice-in-action/rabinkarp/">滑动窗口延伸:Rabin Karp 字符匹配算法</a> 二分搜索算法核心代码模板 <a href="https://labuladong.online/algo/frequency-interview/binary-search-in-action/">实际运用二分搜索时的思维框架</a> 【强化练习】二分搜索算法经典习题 <a href="https://labuladong.online/algo/frequency-interview/random-pick-with-weight/">带权重的随机选择算法</a> 田忌赛马背后的算法决策
<a href="https://labuladong.online/algo/menu/binary-tree/">手把手刷二叉树算法</a> 二叉树系列算法核心纲领 <a href="https://labuladong.online/algo/data-structure/binary-tree-part1/">二叉树心法(思路篇)</a> 二叉树心法(构造篇) <a href="https://labuladong.online/algo/data-structure/binary-tree-part3/">二叉树心法(后序篇)</a> 二叉树心法(序列化篇) <a href="https://labuladong.online/algo/data-structure/bst-part1/">二叉搜索树心法(特性篇)</a> 二叉搜索树心法(基操篇) <a href="https://labuladong.online/algo/data-structure/bst-part3/">二叉搜索树心法(构造篇)</a> 二叉搜索树心法(后序篇)
<a href="https://labuladong.online/algo/menu/100-bt/">套模板解决 100 道二叉树习题</a> 本章导读 <a href="https://labuladong.online/algo/problem-set/binary-tree-traverse-i/">【强化练习】用「遍历」思维解题 I</a> 【强化练习】用「遍历」思维解题 II <a href="https://labuladong.online/algo/problem-set/binary-tree-traverse-iii/">【强化练习】用「遍历」思维解题 III</a> 【强化练习】用「分解问题」思维解题 I <a href="https://labuladong.online/algo/problem-set/binary-tree-divide-ii/">【强化练习】用「分解问题」思维解题 II</a> 【强化练习】同时运用两种思维解题 <a href="https://labuladong.online/algo/problem-set/binary-tree-post-order-i/">【强化练习】利用后序位置解题 I</a> 【强化练习】利用后序位置解题 II <a href="https://labuladong.online/algo/problem-set/binary-tree-post-order-iii/">【强化练习】利用后序位置解题 III</a> 【强化练习】运用层序遍历解题 I <a href="https://labuladong.online/algo/problem-set/binary-tree-level-ii/">【强化练习】运用层序遍历解题 II</a> 【强化练习】二叉搜索树经典例题 I * 【强化练习】二叉搜索树经典例题 II
<a href="https://labuladong.online/algo/menu/more-bt/">二叉树的拓展延伸</a> 拓展:最近公共祖先系列解题框架 <a href="https://labuladong.online/algo/data-structure/count-complete-tree-nodes/">拓展:如何计算完全二叉树的节点数</a> 拓展:惰性展开多叉树 <a href="https://labuladong.online/algo/practice-in-action/merge-sort/">拓展:归并排序详解及应用</a> 拓展:快速排序详解及应用 * 拓展:用栈模拟递归迭代遍历二叉树
<a href="https://labuladong.online/algo/menu/design/">手把手设计数据结构</a> 队列实现栈以及栈实现队列 <a href="https://labuladong.online/algo/problem-set/stack/">【强化练习】栈的经典习题</a> 【强化练习】括号类问题汇总 <a href="https://labuladong.online/algo/problem-set/queue/">【强化练习】队列的经典习题</a> 单调栈算法模板解决三道例题 <a href="https://labuladong.online/algo/problem-set/monotonic-stack/">【强化练习】单调栈的几种变体及经典习题</a> 单调队列结构解决滑动窗口问题 <a href="https://labuladong.online/algo/problem-set/monotonic-queue/">【强化练习】单调队列的通用实现及经典习题</a> 算法就像搭乐高:手撸 LRU 算法 <a href="https://labuladong.online/algo/frequency-interview/lfu/">算法就像搭乐高:手撸 LFU 算法</a> 常数时间删除/查找数组中的任意元素 <a href="https://labuladong.online/algo/problem-set/hash-table/">【强化练习】哈希表更多习题</a> 【强化练习】优先级队列经典习题 <a href="https://labuladong.online/algo/data-structure-basic/tree-map-implement/">TreeMap/TreeSet 代码实现</a> SegmentTree 线段树代码实现 <a href="https://labuladong.online/algo/data-structure/trie-implement/">Trie/字典树/前缀树代码实现</a> 【强化练习】Trie 树算法习题 <a href="https://labuladong.online/algo/data-structure/design-twitter/">设计朋友圈时间线功能</a> 设计考场座位分配算法 <a href="https://labuladong.online/algo/problem-set/ds-design/">【强化练习】更多经典设计习题</a> 拓展:如何实现一个计算器 <a href="https://labuladong.online/algo/practice-in-action/find-median-from-data-stream/">拓展:两个二叉堆实现中位数算法</a> 拓展:数组去重问题(困难版)
<a href="https://labuladong.online/algo/menu/graph/">手把手刷图算法</a> 环检测及拓扑排序算法 <a href="https://labuladong.online/algo/frequency-interview/find-celebrity/">众里寻他千百度:名流问题</a> 二分图判定算法 <a href="https://labuladong.online/algo/data-structure/union-find/">Union-Find 并查集算法</a> 【强化练习】并查集经典习题 <a href="https://labuladong.online/algo/data-structure/kruskal/">Kruskal 最小生成树算法</a> Prim 最小生成树算法 <a href="https://labuladong.online/algo/data-structure/dijkstra/">Dijkstra 算法模板及应用</a> 【强化练习】Dijkstra 算法经典习题
第二章、经典暴力搜索算法
<a href="https://labuladong.online/algo/menu/dfs/">DFS/回溯算法</a> 回溯算法解题套路框架 <a href="https://labuladong.online/algo/practice-in-action/sudoku-nqueue/">回溯算法实践:数独和 N 皇后问题</a> 回溯算法秒杀所有排列/组合/子集问题 <a href="https://labuladong.online/algo/practice-in-action/two-views-of-backtrack/">球盒模型:回溯算法穷举的两种视角</a> 解答回溯算法/DFS算法的若干疑问 <a href="https://labuladong.online/algo/frequency-interview/island-dfs-summary/">一文秒杀所有岛屿题目</a> 回溯算法实践:括号生成 <a href="https://labuladong.online/algo/practice-in-action/partition-to-k-equal-sum-subsets/">回溯算法实践:集合划分</a> 【强化练习】回溯算法经典习题 I <a href="https://labuladong.online/algo/problem-set/backtrack-ii/">【强化练习】回溯算法经典习题 II</a> 【强化练习】回溯算法经典习题 III
<a href="https://labuladong.online/algo/menu/bfs/">BFS 算法</a> BFS 算法解题套路框架 <a href="https://labuladong.online/algo/problem-set/bfs/">【强化练习】BFS 经典习题 I</a> 【强化练习】BFS 经典习题 II * 正在更新 ing
第三章、经典动态规划算法
<a href="https://labuladong.online/algo/menu/dp-basic/">动态规划基本技巧</a> 动态规划解题套路框架 <a href="https://labuladong.online/algo/dynamic-programming/longest-increasing-subsequence/">动态规划设计:最长递增子序列</a> base case 和备忘录的初始值怎么定? <a href="https://labuladong.online/algo/dynamic-programming/two-views-of-dp/">动态规划穷举的两种视角</a> 动态规划和回溯算法的思维转换 <a href="https://labuladong.online/algo/dynamic-programming/space-optimization/">对动态规划进行降维打击</a> 最优子结构原理和 dp 数组遍历方向
<a href="https://labuladong.online/algo/menu/subsequence/">子序列类型问题</a> 经典动态规划:编辑距离 <a href="https://labuladong.online/algo/dynamic-programming/maximum-subarray/">动态规划设计:最大子数组</a> 经典动态规划:最长公共子序列 * 动态规划之子序列问题解题模板
<a href="https://labuladong.online/algo/menu/knapsack/">背包类型问题</a> 经典动态规划:0-1 背包问题 <a href="https://labuladong.online/algo/dynamic-programming/knapsack2/">经典动态规划:子集背包问题</a> 经典动态规划:完全背包问题 * 背包问题的变体:目标和
<a href="https://labuladong.online/algo/menu/dp-game/">用动态规划玩游戏</a> 动态规划之最小路径和 <a href="https://labuladong.online/algo/dynamic-programming/magic-tower/">动态规划帮我通关了《魔塔》</a> 动态规划帮我通关了《辐射4》 <a href="https://labuladong.online/algo/dynamic-programming/cheap-travel/">旅游省钱大法:加权最短路径</a> 经典动态规划:正则表达式 <a href="https://labuladong.online/algo/dynamic-programming/egg-drop/">经典动态规划:高楼扔鸡蛋</a> 经典动态规划:戳气球 <a href="https://labuladong.online/algo/dynamic-programming/game-theory/">经典动态规划:博弈问题</a> 一个方法团灭 LeetCode 打家劫舍问题 * 一个方法团灭 LeetCode 股票买卖问题
<a href="https://labuladong.online/algo/menu/greedy/">贪心类型问题</a> 贪心算法解题套路框架 <a href="https://labuladong.online/algo/frequency-interview/gas-station-greedy/">老司机加油算法</a> 贪心算法之区间调度问题 <a href="https://labuladong.online/algo/frequency-interview/scan-line-technique/">扫描线技巧:安排会议室</a> 剪视频剪出一个贪心算法
第四章、其他常见算法技巧
<a href="https://labuladong.online/algo/menu/math/">数学运算技巧</a> 一行代码就能解决的算法题 <a href="https://labuladong.online/algo/frequency-interview/bitwise-operation/">常用的位操作</a> 谈谈游戏中的随机算法 <a href="https://labuladong.online/algo/frequency-interview/factorial-problems/">讲两道常考的阶乘算法题</a> 如何高效寻找素数 <a href="https://labuladong.online/algo/frequency-interview/quick-power/">如何高效进行模幂运算</a> 如何同时寻找缺失和重复的元素 <a href="https://labuladong.online/algo/frequency-interview/probability-problem/">几个反直觉的概率问题</a> 【强化练习】数学技巧相关习题
<a href="https://labuladong.online/algo/menu/interview/">经典面试题</a> 算法笔试「骗分」套路 <a href="https://labuladong.online/algo/frequency-interview/trapping-rain-water/">如何高效解决接雨水问题</a> 一文秒杀所有丑数系列问题 <a href="https://labuladong.online/algo/practice-in-action/interval-problem-summary/">一个方法解决三道区间问题</a> 谁能想到,斗地主也能玩出算法 <a href="https://labuladong.online/algo/frequency-interview/pancake-sorting/">烧饼排序算法</a> 字符串乘法计算 * 如何判定完美矩形
附录
<a href="https://labuladong.online/algo/changelog/website/">labuladong.online 更新日志</a> 可视化面板更新日志 <a href="https://labuladong.online/algo/changelog/chrome/">Chrome 刷题插件更新日志</a> vscode 刷题插件更新日志 <a href="https://labuladong.online/algo/changelog/jetbrain/">Jetbrain 刷题插件更新日志</a> 网站/插件问题反馈
感谢如下大佬参与翻译
按照昵称字典序排名:
ABCpril, andavid, bryceustc, build2645, CarrieOn, cooker, Dong Wang, ExcaliburEX, floatLig, ForeverSolar, Fulin Li, Funnyyanne, GYHHAHA, Hi_archer, Iruze, Jieyixia, Justin, Kevin, Lrc123, lriy, Lyjeeq, MasonShu, Master-cai, miaoxiaozui2017, natsunoyoru97, nettee, PaperJets, qy-yang, realism0331, SCUhzs, Seaworth, shazi4399, ShuozheLi, sinjoywong, sunqiuming526, Tianhao Zhou, timmmGZ, tommytim0515, ucsk, wadegrc, walsvid, warmingkkk, Wonderxie, wsyzxxxx, xiaodp, youyun, yx-tan, Zero, Ziming
Donate
如果本仓库对你有帮助,可以请作者喝杯速溶咖啡