本站简介

本站简介

如果满分 100 分,无论你的基础如何,本站都可以在最短的时间内帮你提升至 85 分的水平。

因为本站教的是模板化、框架化的思维模式,所以你练成的这个 85 分是可以隔绝运气,稳定复现的。也就是说难度小于 85 的题目,你一定能按部就班地做出来,难度大于 85 的题目,才依赖灵感和运气。

85 分是什么概念?对比参考一下,假设你大学学计算机专业,上过学校开设的数据结构和算法必修课,工作中主要使用各种开发框架,从没刷过算法题,那么你的水平大概是 30~40 分。真的是这样,因为算法这个东西可以理解为一种独立的能力,和编程经验没有直接的关系,需要专门花时间练习。

所以不要觉得 85 分低,这个水平对于技术岗面试笔试和一般的竞赛绰绰够用了。如果你追求

本站目录结构 本站简介针对初学和速成的学习规划 速成读者学习规划 初学读者学习规划 算法刷题的重点和坑 习题章节的练习/复习方法配套学习工具使用指南 算法可视化面板使用说明 算法游戏玩法及汇总 配套 Chrome 刷题插件 配套 vscode 刷题插件 配套 JetBrains 刷题插件 本站付费会员入门:编程语言基础及练习 本章导读 C++ 语言基础 Java 语言基础 Golang 语言基础 Python 语言基础 JavaScript 语言基础 力扣/LeetCode 解题须知 编程语言刷题实践基础:数据结构及排序精讲 本章导读

时间空间复杂度入门

手把手带你实现动态数组

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

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

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

队列/栈基本原理 用链表实现队列/栈 用数组实现队列/栈 双端队列(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 算法经典习题 Kruskal 最小生成树算法 Prim 最小生成树算法第二章、经典暴力搜索算法DFS/回溯算法

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

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

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

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

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

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

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

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

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

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

初识 Linux 文件系统 Linux shell 的使用技巧 非对称加密的使用场景 JWT 的原理与使用 一文读懂 session 和 cookie 浅谈存储系统:LSM 树设计原理正在更新 ing设计模式

单例模式 工厂方法模式 抽象工厂模式 生成器模式 原型模式 适配器模式 组合模式 装饰模式正在更新 ing阅读方法对于准备面试/笔试的读者,可以按照 速成学习计划 中的顺序学习。

对于时间充裕的初学者(比如还未毕业的在校生),按照本站目录顺序阅读,稳扎稳打即可。

本站同时适配 PC 端和移动端,一站式彻底搞定算法笔试面试:

本站内容本站内容包含图文教程和视频讲解,主要分为三类:

1️⃣ 数据结构教程(约占本站全部内容的 10%)

主要集中在 数据结构及排序精讲 这一章。这部分内容讲解排序算法以及经典数据结构的核心原理和代码实现,一般不包含算法题,主要目的是让读者了解工作中常用数据结构的原理,以及算法题中特有数据结构的原理及使用场景,未来做题时可以直接套用。

2️⃣ 结合例题讲解经典算法框架(约占本站全部内容的 50%)

一些比较经典的算法框架或算法题,我会用整篇文章结合具体的例题做比较细致的讲解,目的是让你理解原理。一般每篇文章包含 2~5 道例题,阅读时顺手就能做掉。

3️⃣ 习题章节帮你熟练运用算法框架(约占本站全部内容的 40%)

目录中标有【练习】的内容属于习题部分,一般紧跟在算法框架内容的后面。习题都是可以直接套框架的题目,目的是通过大量的重复帮你练出肌肉记忆,彻底掌握一类题型的解法。每篇强化练习包含 5~10 道习题,掌握算法框架后可以较快解决。

本站可以带你解决几百道力扣公开免费的题目。这些题目中大部分都是用来练习框架思维的,掌握算法框架后几分钟就能解决,不知不觉中这些题目都能做完。

力扣/LeetCode 题单应部分读者的要求,我整理了一份题单,汇总本站涵盖的所有题目。安装 Chrome 插件 后点开这个题单,可以看到所有题目都有本站的题解/思路标记。

但是请注意,我个人觉得这个题单用处不大,也不建议你直接对着这个题单刷题。因为这个题单的题目顺序是随机的,做不到循序渐进地学习,也没办法对某个知识点针对性学习;而且并不需要你真的把这么多题全部做完,学会了核心算法框架后,大部分题都可以直接秒的,不需要刻意去刷:

力扣LeetCodehttps://leetcode.cn/problem-list/59jEaTgw/https://leetcode.com/list/9zwo3ww5/我更建议按照 初学读者学习计划 或者 速成读者学习计划 有条理地学习,在对应的学习计划中有分类后的题单,vscode 插件 和 Jetbrains 插件 也对这两个学习计划进行了集成,方便有需要的读者使用。

已过期的网址/PDF/内容认准本站的最新地址,持续更新:labuladong.online。

由于我在不断更新、优化、修正算法教程,一些历史遗留的内容、网站都应该被废弃,因为现在有更简洁、优质的内容提供给你学习。

我在网络上其他平台发表的算法教程都已经过时,不再更新。

我曾经使用过的网站地址已经不再维护,包括:

labuladong.gitee.io/algo/

labuladong.github.io/algo/

labuladong.gitbook.io/algo/

曾经的 PDF 也已经过时,包括:《labuladong 的算法小抄》《labuladong 的刷题笔记》《labuladong 的算法秘籍》等。

我非常重视大家的学习体验,一直在持续更新和优化本站内容,顶部有 更新日志 和 bug 反馈 入口。

关于作者我是 fucking-algorithm 仓库的作者 labuladong,读者一般叫我「东哥」,首创框架思维解题,多次霸榜 GitHub Trending,目前已获得 125k star。

我个人的风格是专注小而精,不做大而全,所以本站只针对算法刷题这个场景,精准打击,一步到位,让读者在最短的时间内彻底搞定算法。

本站会员 是唯一的付费项目,一顿饭钱,即可解锁本站所有内容和所有配套工具,享受最丝滑流畅的学习体验。

本站实用功能速成路线图本站提供 算法速成规划 并配套学习路线图,点击每个节点即可查看相关文章及题单,方便追踪学习进度。

OJ iframe 算法速成路线图算法可视化在本站以及所有配套插件中,所有解法代码下方都配了一套算法可视化面板,可以直观地查看算法执行过程,辅助理解算法逻辑。

比如这个 计算单链表环起点 的算法,你可以多次点击 if (fast == slow) break 这部分代码,即可看到快慢指针追逐相遇的过程;再多次点击 while (slow != fast) 这部分代码,即可看到快慢指针同步前进在环起点相遇:

Algorithm visualize 案例一、颜色系统及交互Link copied!可视化面板对复杂数据结构和递归算法都有增强,下面是一个 图结构的 DFS 遍历算法,寻找节点 0 到节点 4 的所有路径,你可以多次点击 if (s === n - 1) 这行代码,查看图的遍历过程,以及递归树的生长过程:

Algorithm visualize 案例二、复杂结构及递归Link copied!可视化面板可以以不同的形式展现数据结构,便于读者理解。

比如下面以柱状图的形式展示数组,展示 插入排序 的过程。你可以点击左上角的播放按钮,加快播放速度,查看排序过程:

Algorithm visualize 案例三、排序算法Link copied!可视化面板可以大幅降低你对复杂算法的理解成本,支持所有数据结构和算法,这里仅展示几个例子。更多的经典算法可视化可以在 算法可视化速查页 中查看。

结合游戏,学以致用可视化面板已经可以让读者直观地理解算法执行过程,但光刷题可能有点无聊,我想做点东西把算法和实际生活联系起来,进一步展现算法的魅力,让大家发自内心地喜欢上算法。

我的一个设想就是,把算法和游戏结合起来。我们从来都是用手来操作游戏,那能不能用算法来操作游戏呢?

所以,我会精心设计一些经典小游戏,把其中用到的算法模块抽象出来,给定一个游戏场景,让读者来编写算法让游戏引擎来执行,最终得到一个可运行的游戏,或完成某个(靠手动操作很难完成的)游戏任务。

这样,读者不仅能得到很强的成就感,最重要的是能了解到算法在实际场景中的运用,对算法有更深刻的理解。

比如下面展示一个贪吃蛇游戏,请你来编写贪吃蛇的移动、吃食物逻辑,让游戏运行起来。没有了解过的读者可能会觉得这个实现很复杂,但其实很简单,运用 单链表的基本操作 就可以做到:

更多有趣的小游戏请参见 算法游戏玩法及汇总。

支持所有主流编程语言本站和所有配套插件的所有题解代码都支持了 Java/C++/Python/Golang/JavaScript 等所有常用的编程语言,能尽可能照顾到更多读者的需求。

所有语言的代码都经过了我的亲自验证和调试,确保正确性和一致性。

本站和所有配套插件都支持代码图片注释,对于较为复杂的代码块中会包含小灯泡图标,鼠标移至小灯泡图标上就会弹出图片辅助理解:

javacpppythongojavascriptjavaclass Solution {

public ListNode detectCycle(ListNode head) {

ListNode fast, slow;

fast = slow = head;

while (fast != null && fast.next != null) {

fast = fast.next.next;

slow = slow.next;

if (fast == slow) break;

}

// 上面的代码类似 hasCycle 函数

if (fast == null || fast.next == null) {

// fast 遇到空指针说明没有环

return null;

}

// 重新指向头结点

slow = head;

// 快慢指针同步前进,相交点就是环起点

while (slow != fast) {

fast = fast.next;

slow = slow.next;

}

return slow;

}

}cppclass Solution {

public:

ListNode *detectCycle(ListNode *head) {

ListNode *fast, *slow;

fast = slow = head;

while (fast != nullptr && fast->next != nullptr) {

fast = fast->next->next;

slow = slow->next;

if (fast == slow) break;

}

// 上面的代码类似 hasCycle 函数

if (fast == nullptr || fast->next == nullptr) {

// fast 遇到空指针说明没有环

return nullptr;

}

// 重新指向头结点

slow = head;

// 快慢指针同步前进,相交点就是环起点

while (slow != fast) {

fast = fast->next;

slow = slow->next;

}

return slow;

}

};pythonclass Solution:

def detectCycle(self, head: ListNode):

fast, slow = head, head

while fast and fast.next:

fast = fast.next.next

slow = slow.next

if fast == slow:

break

# 上面的代码类似 hasCycle 函数

if not fast or not fast.next:

# fast 遇到空指针说明没有环

return None

# 重新指向头结点

slow = head

# 快慢指针同步前进,相交点就是环起点

while slow != fast:

fast = fast.next

slow = slow.next

return slowgofunc detectCycle(head *ListNode) *ListNode {

fast, slow := head, head

for fast != nil && fast.Next != nil {

fast = fast.Next.Next

slow = slow.Next

if fast == slow {

break

}

}

// 上面的代码类似 hasCycle 函数

if fast == nil || fast.Next == nil {

// fast 遇到空指针说明没有环

return nil

}

// 重新指向头结点

slow = head

// 快慢指针同步前进,相交点就是环起点

for slow != fast {

fast = fast.Next

slow = slow.Next

}

return slow

}javascriptvar detectCycle = function(head) {

let fast, slow;

fast = slow = head;

while (fast !== null && fast.next !== null) {

fast = fast.next.next;

slow = slow.next;

if (fast == slow) break;

}

// 上面的代码类似 hasCycle 函数

if (fast === null || fast.next === null) {

// fast 遇到空指针说明没有环

return null;

}

// 重新指向头结点

slow = head;

// 快慢指针同步前进,相交点就是环起点

while (slow !== fast) {

fast = fast.next;

slow = slow.next;

}

return slow;

};其他实用功能支持阅读历史。在侧边栏和所有文章内,未读过的文章链接前面会显示 标记,读过但未学完的文章会显示 标记,学完的文章会显示 标记,方便你了解自己的学习进度。阅读历史会自动同步到所有设备。

支持专注模式。电脑访问网站时,页面右上角有一个「专注模式」开关,开启后会模糊侧边栏及顶栏,方便集中注意力,或者方便在公司学习的读者。

支持全站搜索。页面右上角的搜索框支持全站搜索,输入力扣的题目、题号、链接也可以直接搜索对应的讲解。

配套刷题插件辅助学习为了尽可能满足不同读者的需求,我开发维护了本站配套刷题插件,可以让读者在喜欢的代码编辑器中刷题,方便摸鱼。

刷题插件集成了 初学者目录 和 速成目录,支持本地调试代码,还可以方便的查看本站的思路讲解、可视化面板、图片注释等实用功能。

刷题插件并不是必须安装的,但我会建议安装 Chrome 浏览器插件,因为你在阅读本站时,可能会经常跳转到 LeetCode/力扣 页面上刷题,Chrome 插件能够给你提供一些帮助。vscode/Jetbrain 插件可以根据自己的刷题需求选择安装。

各个刷题插件的安装使用方法详见 Chrome 插件、vscode 插件、Jetbrain 插件。

📌 相关推荐