← Back
labuladong

labuladong/fucking-algorithm

Crack LeetCode, not only how, but also why.

View on GitHub ↗https://labuladong.online/ ↗
algorithmscomputer-sciencedata-structuresdynamic-programmingdynamic-programming-algorithminterview-questionskmpleetcode
Stars
136.1K
Forks
23.5K
Watchers
136.1K
Open issues
1
Contributors
101
Language
Markdown
License
—
Default branch
master
Created Feb 19, 2020Updated Feb 28, 2026

Star growth

Today—
This week—
This month—

Star history will appear here once this repo has been tracked for a couple of days.

README

Star History Chart

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 等)上刷题的读者可以使用该插件。安装使用手册见下方目录。

最后祝大家学习愉快,在题海中自在遨游!

文章目录

  • 本站简介

  • 针对初学和速成的学习规划

    • 速成目录学习规划
    • 完整目录学习规划
    • 算法刷题的重点和坑
    • 习题章节的练习/复习方法
  • 配套学习工具使用指南

    • AI 助教随时答疑
    • 算法可视化面板使用说明
    • 算法游戏玩法及汇总
    • 配套 Chrome 刷题插件
    • 配套 vscode/cursor 刷题插件
    • 配套 JetBrains 刷题插件
    • 本站付费会员
  • 入门:编程语言基础及练习

    • 本章导读
    • C++ 语言基础
    • Java 语言基础
    • Golang 语言基础
    • Python 语言基础
    • JavaScript 语言基础
    • 力扣/LeetCode 解题须知
    • 编程语言刷题实践
    • ACM 模式代码模板
  • 基础:数据结构及排序精讲

    • 本章导读

    • 时间空间复杂度入门

    • 手把手带你实现动态数组

      • 数组(顺序存储)基本原理
      • 动态数组代码实现
    • 手把手带你实现单/双链表

      • 链表(链式存储)基本原理
      • 链表代码实现
      • 【游戏】实现贪吃蛇
    • 数组链表的种种变换

      • 环形数组技巧及实现
      • 跳表核心原理
      • 位图原理及实现
    • 手把手带你实现队列/栈

      • 队列/栈基本原理
      • 用链表实现队列/栈
      • 用数组实现队列/栈
      • 双端队列(Deque)原理及实现
    • 哈希表的原理及实现

      • 哈希表核心原理
      • 用拉链法实现哈希表
      • 线性探查法的两个难点
      • 线性探查法的两种代码实现
      • 哈希集合的原理及代码实现
    • 哈希表结构的种种变换

      • 用链表加强哈希表(LinkedHashMap)
      • 用数组加强哈希表(ArrayHashMap)
      • 布隆过滤器原理及实现
    • 二叉树结构及遍历

      • 二叉树基础及常见类型
      • 二叉树的递归/层序遍历
      • DFS 和 BFS 的适用场景
      • 多叉树的递归/层序遍历
    • 二叉树结构的种种变换

      • 二叉搜索树的应用及可视化
      • 红黑树的完美平衡及可视化
      • Trie/字典树/前缀树原理及可视化
      • 二叉堆核心原理及可视化
      • 二叉堆/优先级队列代码实现
      • 线段树核心原理及可视化
      • 数据压缩和霍夫曼树
      • 正在更新 ing
    • 图结构基础及算法概览

      • 图论中的基本术语
      • 图结构的通用代码实现
      • 图结构的 DFS/BFS 遍历
      • 欧拉图和一笔画游戏
      • 图结构最短路径算法概览
      • 最小生成树算法概览
      • Union Find 并查集原理
      • 正在更新 ing
    • 十大排序算法原理及可视化

      • 本章导读
      • 排序算法的关键指标
      • 选择排序所面临的问题
      • 拥有稳定性:冒泡排序
      • 运用逆向思维:插入排序
      • 突破 O(N^2):希尔排序
      • 妙用二叉树前序位置:快速排序
      • 妙用二叉树后序位置:归并排序
      • 二叉堆结构的运用:堆排序
      • 全新的排序原理:计数排序
      • 博采众长:桶排序
      • 基数排序(Radix Sort)
    • 正在更新 ing

  • 第零章、核心刷题框架汇总

    • 本章导读
    • 学习数据结构和算法的框架思维
    • 双指针技巧秒杀七道链表题目
    • 双指针技巧秒杀七道数组题目
    • 滑动窗口算法核心代码模板
    • 二叉树系列算法核心纲领
    • 一个视角 + 两种思维模式搞定递归
    • 动态规划解题套路框架
    • 回溯算法解题套路框架
    • BFS 算法解题套路框架
    • 回溯算法秒杀所有排列/组合/子集问题
    • 贪心算法解题套路框架
    • 分治算法解题套路框架
    • 算法时空复杂度分析实用指南
  • 第一章、经典数据结构算法

    • 手把手刷链表算法

      • 双指针技巧秒杀七道链表题目
      • 链表双指针经典习题
      • 单链表的花式反转方法汇总
      • 如何判断回文链表
    • 手把手刷数组算法

      • 双指针技巧秒杀七道数组题目
      • 【游戏】消消乐游戏
      • 二维数组的花式遍历技巧
      • 数组双指针经典习题
      • 【游戏】生命游戏
      • 一个方法团灭 nSum 问题
      • 小而美的算法技巧:前缀和数组
      • 前缀和技巧经典习题
      • 小而美的算法技巧:差分数组
      • 滑动窗口算法核心代码模板
      • 滑动窗口算法经典习题
      • 滑动窗口延伸:Rabin Karp 字符匹配算法
      • 二分搜索算法核心代码模板
      • 二分搜索左闭右开写法
      • 实际运用二分搜索时的思维框架
      • 二分搜索算法经典习题
      • 带权重的随机选择算法
      • 田忌赛马背后的算法决策
    • 经典队列/栈算法

      • 队列实现栈以及栈实现队列
      • 栈的经典习题
      • 括号类问题汇总
      • 队列的经典习题
      • 单调栈算法模板解决三道例题
      • 单调栈的几种变体及经典习题
      • 单调队列结构解决滑动窗口问题
      • 单调队列的通用实现及经典习题
    • 手把手刷二叉树算法

      • 二叉树系列算法核心纲领
      • 二叉树心法(思路篇)
      • 二叉树心法(构造篇)
      • 二叉树心法(后序篇)
      • 二叉树心法(序列化篇)
      • 二叉搜索树心法(特性篇)
      • 二叉搜索树心法(基操篇)
      • 二叉搜索树心法(构造篇)
      • 二叉搜索树心法(后序篇)
    • 二叉树算法习题汇总

      • 本章导读
      • 用「遍历」思维解题 I
      • 用「遍历」思维解题 II
      • 用「遍历」思维解题 III
      • 用「分解问题」思维解题 I
      • 用「分解问题」思维解题 II
      • 同时运用两种思维解题
      • 利用后序位置解题 I
      • 利用后序位置解题 II
      • 利用后序位置解题 III
      • 运用层序遍历解题 I
      • 运用层序遍历解题 II
      • 二叉搜索树经典例题 I
      • 二叉搜索树经典例题 II
    • 二叉树的拓展延伸

      • 拓展:最近公共祖先系列解题框架
      • 拓展:如何计算完全二叉树的节点数
      • 拓展:惰性展开多叉树
      • 拓展:归并排序详解及应用
      • 拓展:快速排序详解及应用
      • 拓展:用栈模拟递归迭代遍历二叉树
    • 经典数据结构设计

      • 算法就像搭乐高:手撸 LRU 算法
      • 算法就像搭乐高:手撸 LFU 算法
      • 常数时间删除/查找数组中的任意元素
      • 哈希表更多习题
      • 优先级队列经典习题
      • TreeMap/TreeSet 代码实现
      • 基本线段树的代码实现
      • 优化:实现动态线段树
      • 优化:实现懒更新线段树
      • 线段树经典习题
      • Trie 树代码实现
      • Trie 树算法习题
      • 设计考场座位分配算法
      • 更多经典设计习题
      • 实现霍夫曼编码压缩算法
      • 一致性哈希算法的原理及实现
      • 拓展:如何实现一个计算器
      • 拓展:两个二叉堆实现中位数算法
      • 拓展:数组去重问题(困难版)
    • 经典图算法

      • 二分图判定算法
      • Hierholzer 算法寻找欧拉路径
      • 欧拉路径经典习题
      • 环检测算法
      • 拓扑排序算法
      • Union-Find 并查集算法
      • 并查集经典习题
      • Dijkstra 算法核心原理及实现
      • Dijkstra 拓展:带限制的最短路问题
      • Dijkstra 算法经典习题
      • A* 算法核心原理及实现
      • Kruskal 最小生成树算法
      • Prim 最小生成树算法
  • 第二章、经典暴力搜索算法

    • DFS/回溯算法

      • 回溯算法解题套路框架
      • 回溯算法实践:数独和 N 皇后问题
      • 【游戏】实现数独作弊器
      • 回溯算法秒杀所有排列/组合/子集问题
      • 解答回溯算法/DFS算法的若干疑问
      • 一文秒杀所有岛屿题目
      • 【游戏】扫雷 II
      • 球盒模型:回溯算法穷举的两种视角
      • 回溯算法实践:括号生成
      • 回溯算法实践:集合划分
      • 回溯算法经典习题 I
      • 回溯算法经典习题 II
      • 回溯算法经典习题 III
    • BFS 算法

      • BFS 算法解题套路框架
      • 【游戏】求解迷宫
      • 【游戏】华容道游戏
      • 【游戏】连连看游戏
      • BFS 经典习题 I
      • BFS 经典习题 II
  • 第三章、经典动态规划算法

    • 动态规划基本技巧

      • 动态规划解题套路框架
      • 动态规划设计:最长递增子序列
      • base case 和备忘录的初始值怎么定?
      • 动态规划穷举的两种视角
      • 动态规划和回溯算法的思维转换
      • 对动态规划进行空间压缩
      • 最优子结构原理和 dp 数组遍历方向
    • 子序列类型问题

      • 经典动态规划:编辑距离
      • 动态规划设计:最大子数组
      • 经典动态规划:最长公共子序列
      • 动态规划之子序列问题解题模板
    • 背包类型问题

      • 经典动态规划:0-1 背包问题
      • 经典动态规划:子集背包问题
      • 经典动态规划:完全背包问题
      • 背包问题的变体:目标和
    • 用动态规划玩游戏

      • 动态规划之最小路径和
      • 动态规划帮我通关了《魔塔》
      • 动态规划帮我通关了《辐射4》
      • 旅游省钱大法:加权最短路径
      • 多源最短路径:Floyd 算法
      • 经典动态规划:正则表达式
      • 经典动态规划:高楼扔鸡蛋
      • 经典动态规划:戳气球
      • 经典动态规划:博弈问题
      • 一个方法团灭 LeetCode 打家劫舍问题
      • 一个方法团灭 LeetCode 股票买卖问题
    • 动态规划习题集

      • 打家劫舍问题模式
      • 背包问题经典习题
      • 动态规划经典习题 I
      • 动态规划经典习题 II
    • 贪心类型问题

      • 贪心算法解题套路框架
      • 老司机加油算法
      • 贪心算法之区间调度问题
      • 扫描线技巧:安排会议室
      • 剪视频剪出一个贪心算法
  • 第四章、其他常见算法技巧

    • 数学运算技巧

      • 一行代码就能解决的算法题
      • 常用的位操作
      • 必知必会数学技巧
      • 【游戏】扫雷游戏地图生成器
      • 谈谈游戏中的随机算法
      • 讲两道常考的阶乘算法题
      • 如何高效寻找素数
      • 如何同时寻找缺失和重复的元素
      • 几个反直觉的概率问题
      • 数学技巧相关习题
    • 经典面试题

      • 如何高效解决接雨水问题
      • 一文秒杀所有丑数系列问题
      • 一个方法解决三道区间问题
      • 谁能想到,斗地主也能玩出算法
      • 烧饼排序算法
      • 字符串乘法计算
      • 如何判定完美矩形
  • 更多内容

    • 计算机基础知识

      • AI 时代的前端开发入门教程
      • 现代加密技术入门
      • 深入理解 session 和 cookie
      • 深入理解 JSON Web Token (JWT)
      • 认证和授权的区别与联系
      • 深入理解 OAuth 2.0 授权框架
      • OAuth 2.0 和 OIDC 认证
      • OAuth 2.0 与 PKCE
      • 深入理解单点登录 (SSO)
      • 深入理解数字证书和 CA
      • 深入理解 TLS 密钥协商
      • 深入理解 mTLS 双向认证
      • 初识 Linux 文件系统
      • Linux的进程、线程、文件描述符是什么
      • Linux 管道符的坑
      • Linux shell 的使用技巧
      • 浅谈存储系统:LSM 树设计原理
      • 正在更新 ing
    • 设计模式

      • 单例模式
      • 工厂方法模式
      • 抽象工厂模式
      • 生成器模式
      • 原型模式
      • 适配器模式
      • 组合模式
      • 装饰模式
      • 桥接模式
      • 观察者模式
      • 策略模式
      • 正在更新 ing

感谢如下大佬参与翻译

按照昵称字典序排名:

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

如果本仓库对你有帮助,可以请作者喝杯速溶咖啡