目录

fucking-algorithm:142k Stars 刷穿算法题完全指南

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 Stars142k
GitHub Forks24.8k
Contributors200
Commits4,280
最新版本v3.0 (2024-12-17)
LicenseAll 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+PLeetCode: 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
Englishen.labuladong.com
Españoles.labuladong.com
日本語ja.labuladong.com
한국어kr.labuladong.com
Portuguêspt.labuladong.com
Françaisfr.labuladong.com
Русскийru.labuladong.com
اردوud.labuladong.com

5.2 如何选择语言版本

如果英文阅读有困难,先用中文版打基础,把框架和模板建立起来;再用英文版复习,顺便熟悉面试中常用的英文算法术语。其他语言版本主要用于扩展阅读,对算法本身的学习没有额外价值。

6. 配套资源

6.1 微信公众号

labuladong 公众号提供:

资源说明
视频教程配套算法视频讲解
每日一题每天一道算法题
面试技巧互联网大厂面试经验
源码解析框架源码分析

6.2 LeetCode 题目分类

按知识点分类练习的推荐顺序是:数组 → 字符串 → 链表 → 哈希表 → 栈和队列 → 二叉树 → 图论 → 动态规划 → 回溯 → 位运算。这个顺序遵循"先线性结构再树形结构,先确定性算法再穷举类算法"的递进逻辑。

6.3 面试高频题型

下面是互联网大厂面试中出现频率较高的 10 道题,覆盖了主要专题:

排名题目难度类型
1LRU 缓存中等设计类
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 题
大厂 offer200-300 题
算法竞赛300+ 题

8.3 遗忘怎么办

问题:刷过的题忘记了怎么办?

答案

  1. 定期复习(隔 1 天、3 天、7 天)
  2. 总结题型模板
  3. 写博客记录学习心得

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