fucking-algorithm:142k Stars 刷穿算法题完全指南
posts posts 2026-04-06T22:25:00+08:00全面介绍 142k Stars 的 fucking-algorithm 算法刷题笔记,涵盖学习路径、vscode-leetcode 插件、动态规划、回溯算法、二叉树、双指针等主要专题,以及多语言版本和面试技巧。技术笔记fucking-algorithm, 算法, 动态规划, LeetCode, vscode-leetcode, 刷题fucking-algorithm:142k Stars 刷穿算法题完全指南
fucking-algorithm 的核心主张只有一句话:按专题路径刷题,而不是按题号顺序刷。LeetCode 题号本身是出题时间序,相邻题目之间往往毫无关联,按号刷等于在随机序列里找规律。这个项目把算法题按"动态规划、回溯、二叉树、双指针"等专题重新组织,先建立框架再做题,142k Stars 的背后是这套路径被反复验证有效。
学习目标
读完本文后,你应当能够:
- 说出 fucking-algorithm 推荐的四个刷题阶段,以及每个阶段要建立的"框架感"是什么
- 在 VS Code 中用 vscode-leetcode 插件完成"读题—写代码—提交—看题解"的完整闭环
- 解释动态规划、回溯、二叉树、双指针、BFS/DFS 五类框架为什么长成那个形状
- 把一道陌生题套进通用解题框架,定位它属于哪个专题、用哪套模板
- 根据自己的目标(面试、竞赛、补基础)选择对应的刷题数量和复习节奏
1. 项目概述
1.1 是什么
fucking-algorithm 是一个算法刷题笔记项目,中文名"刷穿算法题",英文标签"Crack Algorithm Problems"。
1.2 项目数据
| 指标 | 数值 |
|---|---|
| GitHub Stars | 142k |
| GitHub Forks | 24.8k |
| Contributors | 200 |
| Commits | 4,280 |
| 最新版本 | v3.0 (2024-12-17) |
| License | All Rights Reserved |
| 语言 | Markdown 100% |
1.3 项目特色
| 特色 | 说明 |
|---|---|
| 先刷哪些题 | 学习路径清晰,不盲目刷题 |
| 多语言支持 | 简体中文、English、日语、韩语等 8+ 语言 |
| VS Code 插件 | vscode-leetcode 插件支持 |
| 公众号 | labuladong 提供配套视频教程 |
| 实用技巧 | 涵盖面试高频题型和解题模板 |
1.4 创始人
labuladong 是创始人兼主要维护者,同时运营同名微信公众号,提供算法教学视频。
2. 学习路径
2.1 为什么刷题顺序很重要
LeetCode 上按题号顺序刷效率很低,这个项目的核心主张是:先刷哪些题,再刷哪些题,按专题路径推进。题号是出题时间序,相邻题目可能一个是动态规划、一个是图论,没有迁移价值;按专题刷则能在同一框架下连续做 5–10 道题,把模板从"看懂"练到"会写"。
2.2 推荐学习顺序
fucking-algorithm 把刷题拆成四个阶段,每个阶段对应一种"框架感"的建立:
| 阶段 | 主题 | 要建立的框架感 |
|---|---|---|
| 第一阶段 | 数组、链表、栈、队列、哈希表、树、二叉树、图(了解) | 数据结构本身的遍历与操作模板 |
| 第二阶段 | 二分搜索、双指针、滑动窗口、排序 | 在线性结构上做"区间收缩"的套路 |
| 第三阶段 | 动态规划、回溯算法、位运算、BFS/DFS | 状态定义 + 选择穷举的递归框架 |
| 第四阶段 | 链表二叉树高级技巧、数据结构设计、算法思维 | 把前三阶段的模板组合应用到非常规题型 |
前两阶段是"工具",第三阶段是"主菜"——面试高频题大多落在动态规划和回溯里,第四阶段是把工具用熟后的延伸。如果时间紧,第二阶段可以压缩,但第三阶段不能跳。
2.3 刷题框架
fucking-algorithm 反复强调一句话:所有算法题本质都是"穷举"。动态规划是聪明的穷举(备忘录去重),回溯是带剪枝的穷举,BFS/DFS 是图上的穷举。下面这个通用框架把所有专题统一起来:
# 1. 明确函数定义
def dp(state1, state2, ...):
# 2. 穷举所有选择
for choice in choices:
# 3. 做出选择
new_state = transition(state, choice)
# 4. 递归求解子问题
result = dp(new_state1, new_state2, ...)
# 5. 返回最优解
return best(result, ...)这套框架的关键在于:先想清楚"状态是什么、选择是什么",再写代码。状态定义错了,后面写多少行都是白费。
3. VS Code 插件
3.1 vscode-leetcode
VS Code 中的 LeetCode 插件,可以直接在 VS Code 中刷题、查看题解、提交代码。它的价值在于把"切浏览器—登录—找题—粘贴代码—提交"这条链路压成编辑器内的快捷键,刷题节奏不会被频繁切窗打断。
支持的编程语言:
| 语言 | 支持状态 |
|---|---|
| Python | ✅ 完整支持 |
| JavaScript/TypeScript | ✅ 完整支持 |
| Java | ✅ 完整支持 |
| C++ | ✅ 完整支持 |
| Go | ✅ 完整支持 |
| Rust | ✅ 完整支持 |
| 其他 | 🔧 部分支持 |
3.2 安装
在 VS Code 扩展面板搜索 “LeetCode”,或直接访问插件市场:https://marketplace.visualstudio.com/items?itemName=shengchen.vscode-leetcode
3.3 主要功能
| 功能 | 说明 |
|---|---|
| 刷题模式 | 在 VS Code 中查看题目、编写代码、提交 |
| 题解 | 查看高票回答和讨论 |
| 测试 | 本地测试用例 |
| 竞赛 | 参与 LeetCode 周赛/双周赛 |
| 收藏 | 收藏感兴趣的题目 |
3.4 使用技巧
刷题闭环由四个快捷键串起来:登录账号(Ctrl+Shift+P → LeetCode: Sign In)、切换题目语言(LeetCode: Switch Solution Language)、提交代码(Ctrl+Enter)、查看高票题解(Ctrl+Shift+S)。把这四个动作练成肌肉记忆后,单道题的"读—写—提交—看题解"循环可以在不离开 VS Code 的情况下完成。
4. 算法专题
4.1 动态规划(DP)
动态规划的本质是"带备忘录的递归"。如果一道题满足两个条件——存在重叠子问题、具备最优子结构——就可以用 DP。重叠子问题意味着递归会反复算同一个状态,备忘录(数组或哈希表)把这些重复结果存下来,把指数级复杂度压到多项式级。
动态规划四要素:
# 1. 状态定义
# dp[i] 表示...
# 2. 状态转移方程
# dp[i] = dp[i-1] + dp[i-2]
# 3. 初始化
# dp[0] = 1, dp[1] = 1
# 4. 遍历顺序
# 从前到后遍历四要素里状态定义是命门。状态定义对了,转移方程往往自然就出来;状态定义错了,怎么凑都凑不出正确结果。一个经验法则:状态要能完整描述"当前局面",且当前局面的最优解只依赖更小的局面。
经典问题:
| 问题 | 难度 | 标签 |
|---|---|---|
| 爬楼梯 | 简单 | 斐波那契 |
| 编辑距离 | 困难 | 字符串 DP |
| 最长公共子序列 | 中等 | 序列 DP |
| 背包问题 | 中等/困难 | 背包 DP |
4.2 回溯算法
回溯就是"DFS + 撤销选择"。它解决的核心问题是:在所有可能的选择树里找出满足条件的路径。框架之所以长成"做选择 → 递归 → 撤销选择"这个形状,是因为只有这样写才能在递归返回后恢复现场,让下一个分支从干净的状态开始。如果忘了撤销选择,分支之间会互相污染。
回溯算法框架:
def backtrack(path, choices):
if is_end_condition(path):
result.add(path)
return
for choice in choices:
# 做选择
path.add(choice)
# 递归
backtrack(path, remaining_choices)
# 撤销选择
path.remove(choice)经典问题:
| 问题 | 难度 | 说明 |
|---|---|---|
| 全排列 | 中等 | 回溯 + 剪枝 |
| N 皇后 | 困难 | 二维回溯 |
| 子集 | 中等 | 收集所有叶子节点 |
| 组合总和 | 中等 | 去重技巧 |
4.3 二叉树
二叉树题目的关键不是记遍历顺序,而是想清楚"当前节点需要做什么"。fucking-algorithm 把二叉树问题归纳为一句话:前序位置处理"进入节点时的事",后序位置处理"离开节点时的事"。比如求最大深度,前序位置可以往下传深度,后序位置可以往上返回子树最大深度——两种写法都对,选哪种取决于你需要的信息流向。
二叉树遍历框架:
def traverse(root):
if not root:
return
# 前序位置(在访问左右子节点之前)
traverse(root.left)
# 中序位置(在访问左右子节点之间)
traverse(root.right)
# 后序位置(在访问左右子节点之后)一旦你能把题目翻译成"前序做什么 / 后序做什么",二叉树题基本就解决了一半。BST(二叉搜索树)的题目还会额外利用"中序遍历是升序"这个性质。
经典问题:
| 问题 | 难度 | 说明 |
|---|---|---|
| 二叉树最大深度 | 简单 | 递归/DFS |
| 二叉树最近公共祖先 | 中等 | 后序遍历 |
| 二叉树展开链表 | 中等 | 改造成链表 |
| 验证二叉搜索树 | 中等 | BST 特性 |
4.4 双指针
双指针之所以有效,是因为它利用了"单调性"——当数组有序或链表无环时,两个指针按特定规则移动可以避免重复比较,把 O(n²) 的暴力枚举压到 O(n)。对撞双指针依赖数组有序(左右指针从两端向中间收缩),快慢指针依赖链表结构(用来找中点或检测环)。两种指针的本质都是"用结构性质换掉无脑枚举"。
双指针技巧:
# 1. 对撞双指针(左右指针向中间移动)
def two_pointers_opposite(arr):
left, right = 0, len(arr) - 1
while left < right:
if condition(arr[left], arr[right]):
return result
left += 1
right -= 1
# 2. 快慢指针(fast 和 slow 指针)
def fast_slow_pointer(head):
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow # 中点经典问题:
| 问题 | 难度 | 说明 |
|---|---|---|
| 有序数组两数之和 | 简单 | 对撞双指针 |
| 环形链表 | 简单 | 快慢指针 |
| 滑动窗口 | 中等/困难 | 变长窗口 |
4.5 BFS 和 DFS
BFS 和 DFS 都是图遍历,但解决的问题不同。BFS 用队列保证"层序",天然适合求最短路径(无权图)或层级遍历;DFS 用栈(或递归)保证"深入到底",适合求所有路径、连通性、拓扑排序。选哪个的判断标准:关心最短/最少 → BFS;关心所有可能/连通性 → DFS。
BFS 框架:
from collections import deque
def bfs(graph, start):
visited = set()
queue = deque([start])
while queue:
node = queue.popleft()
if node in visited:
continue
visited.add(node)
for neighbor in graph[node]:
if neighbor not in visited:
queue.append(neighbor)DFS 框架:
def dfs(node, visited):
if node in visited:
return
visited.add(node)
for neighbor in node.neighbors:
dfs(neighbor, visited)注意 BFS 框架里 visited 的判断位置——在 popleft 之后判断而不是在 append 之前判断,会导致同一节点被多次入队,浪费空间。生产代码里更推荐在 append 前就检查 visited。
5. 多语言版本
5.1 支持的语言
fucking-algorithm 提供以下语言版本:
| 语言 | 网站 |
|---|---|
| 简体中文 | labuladong.github.io |
| English | en.labuladong.com |
| Español | es.labuladong.com |
| 日本語 | ja.labuladong.com |
| 한국어 | kr.labuladong.com |
| Português | pt.labuladong.com |
| Français | fr.labuladong.com |
| Русский | ru.labuladong.com |
| اردو | ud.labuladong.com |
5.2 如何选择语言版本
如果英文阅读有困难,先用中文版打基础,把框架和模板建立起来;再用英文版复习,顺便熟悉面试中常用的英文算法术语。其他语言版本主要用于扩展阅读,对算法本身的学习没有额外价值。
6. 配套资源
6.1 微信公众号
labuladong 公众号提供:
| 资源 | 说明 |
|---|---|
| 视频教程 | 配套算法视频讲解 |
| 每日一题 | 每天一道算法题 |
| 面试技巧 | 互联网大厂面试经验 |
| 源码解析 | 框架源码分析 |
6.2 LeetCode 题目分类
按知识点分类练习的推荐顺序是:数组 → 字符串 → 链表 → 哈希表 → 栈和队列 → 二叉树 → 图论 → 动态规划 → 回溯 → 位运算。这个顺序遵循"先线性结构再树形结构,先确定性算法再穷举类算法"的递进逻辑。
6.3 面试高频题型
下面是互联网大厂面试中出现频率较高的 10 道题,覆盖了主要专题:
| 排名 | 题目 | 难度 | 类型 |
|---|---|---|---|
| 1 | LRU 缓存 | 中等 | 设计类 |
| 2 | 两数之和 | 简单 | 哈希表 |
| 3 | 合并两个有序链表 | 简单 | 链表 |
| 4 | 括号生成 | 中等 | 回溯 |
| 5 | 全排列 | 中等 | 回溯 |
| 6 | 二叉树最近公共祖先 | 中等 | 二叉树 |
| 7 | 岛屿数量 | 中等 | DFS/BFS |
| 8 | 滑动窗口最大值 | 困难 | 单调队列 |
| 9 | 合并 K 个有序链表 | 困难 | 堆/分治 |
| 10 | 接雨水 | 困难 | 双指针/DP |
7. 学习方法
7.1 正确刷题流程
一道题从读到提交,应当走完四个动作:先读懂题目(输入输出、边界条件、复杂度要求),再分析思路(暴力解法是什么、有没有重复子问题可以优化),然后写代码(先写框架再填细节),最后测试验证(正常 case、边界 case、性能 case)。跳过任何一步都会留下盲区——尤其是边界 case,面试时挂在这里的人最多。
7.2 面试技巧
面试场景下刷题流程被压缩成四步:Clarify(提问明确需求和边界)、Plan(说出思路并分析复杂度)、Code(边说边写、保持代码规范)、Verify(跑测试用例、分析边界情况)。和独自刷题的区别在于——面试官看不到你的脑子,只能看到你的嘴和手,所以"边说边写"比"闷头写完再讲"更安全。
7.3 常见错误
| 错误 | 正确做法 |
|---|---|
| 直接看答案 | 先思考,实在不会再看 |
| 只看不练 | 每道题都要自己写 |
| 不复习 | 定期回顾已刷题目 |
| 死记硬背 | 理解算法思想 |
8. 常见问题
8.1 刷题顺序
问题:应该按顺序刷还是随机刷?
答案:按照项目推荐的学习路径刷题效率最高。不要按题号顺序刷,那是随机顺序。
8.2 需要刷多少题
问题:LeetCode 刷多少题够用?
答案:
| 目标 | 推荐数量 |
|---|---|
| 通过面试 | 100-200 题 |
| 大厂 offer | 200-300 题 |
| 算法竞赛 | 300+ 题 |
8.3 遗忘怎么办
问题:刷过的题忘记了怎么办?
答案:
- 定期复习(隔 1 天、3 天、7 天)
- 总结题型模板
- 写博客记录学习心得
9. 采用顺序与决策建议
不同读者进入这个项目的姿势不一样,下面给出三种典型场景的采用顺序:
场景 A:3 个月内要面试,已有数据结构基础 直接跳到第 4 章的动态规划和回溯,配合第 6.3 节的 TOP 10 高频题刷。二叉树和双指针用 1–2 天过一遍框架即可,不要在基础题上耗时间。
场景 B:零基础或转行,6 个月以上时间 严格按第 2.2 节的四阶段顺序走,前两阶段每阶段 2–3 周,第三阶段 4–6 周,第四阶段按兴趣推进。每刷完一个专题写一篇小结,记录"这个专题的框架是什么、我卡在哪"。
场景 C:已刷 200+ 题,准备竞赛 重点放在第四阶段的"数据结构设计"和"算法思维",配合公众号的每日一题保持手感。竞赛题和面试题的差距在于——竞赛题需要识别冷门技巧(如并查集、字典树、单调栈),面试题更看重框架的熟练度。
通用建议:无论哪种场景,都先用 vscode-leetcode 插件把刷题环境搭好。环境摩擦力越小,越容易坚持每天刷。
10. 总结
fucking-algorithm 不是一本算法教材,而是一套"刷题路径 + 框架模板"的组合。它的价值在于把 LeetCode 上 3000+ 道题压缩成几个专题,每个专题给一套可复用的代码骨架,让你在做新题时能快速定位"这题属于哪个框架、状态怎么定义、选择怎么穷举"。配合 vscode-leetcode 插件和多语言版本,整个学习闭环可以在编辑器内完成,不需要在浏览器和 IDE 之间反复切换。
官方资源:
- GitHub:https://github.com/labuladong/fucking-algorithm
- 英文版:https://github.com/labuladong/labuladong.github.io
- VS Code 插件:https://marketplace.visualstudio.com/items?itemName=shengchen.vscode-leetcode
- 微信公众号:labuladong