# 卡哥 Hot100 题解写作风格指南

基于对 0001.两数之和、0015.三数之和、0027.移除元素、0039.组合总和、0046.全排列、0077.组合、0053.最大子序和、0070.爬楼梯、0042.接雨水、0084.柱状图中最大的矩形、0101.对称二叉树、0102.二叉树的层序遍历、0020.有效的括号、0121.买卖股票的最佳时机、0072.编辑距离、0037.解数独、0051.N皇后、0131.分割回文串、0045.跳跃游戏II、0106.构造二叉树、0115.不同的子序列 等 20+ 篇题解的风格提炼。


# 一、Frontmatter 规范

---
description: 一句话概括题目+解法核心(不用太长,30-50字即可)
keywords:
  - 题目关键词1
  - 题目关键词2
  - 算法名称
  - 数据结构
tags:
  - 算法分类
  - 数据结构
title: "题号. 题目名称 | 算法1 | 算法2 | Hot100"
---
1
2
3
4
5
6
7
8
9
10
11
12

# 要点

  • title 格式题号. 题目名 | 核心算法1 | 核心算法2 | Hot100,竖线分隔,Hot100 放最后
  • description:简洁说明题目和核心解法,30-50字
  • keywords:3-6个,覆盖题目名、算法名、数据结构名
  • tags:2-4个,比 keywords 更宏观(如"哈希表""动态规划")

# 示例

title: "49. 字母异位词分组 | 哈希表 | Hot100"
title: "53. 最大子数组和 | 贪心 & 动态规划 | Hot100"
title: "128. 最长连续序列 | 哈希表 | Hot100"
1
2
3

# 二、文章结构(Hot100 版本)

Hot100 题解比主目录更精炼、更结构化,不需要广告 banner 和"算法公开课"板块。

# 标准结构

# 题号. 题目名称

[力扣题目链接](https://leetcode.cn/problems/xxx/)

## 题目描述

(题目文字、示例、提示)

## 思路

(核心解法讲解,循序渐进)

## 模拟过程

(用具体示例逐步演示算法流程,配图)

## 解题代码

(C++ 为主语言,带中文注释)

## 复杂度分析

## 其他语言

### Python3
### Java
### Go
### JS

## 与代码随想录联系

(关联主站相关题目和学习路径)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

# 结构说明

  1. 题目描述:直接从力扣原文摘录,包括题目、示例、提示,格式整洁
  2. 思路:核心讲解区,先抛问题再逐步分析(详见"思路写法"章节)
  3. 模拟过程:Hot100 特色板块,用具体数据一步步走算法,配图说明
  4. 解题代码:C++ 为主,注释精炼,用中文
  5. 复杂度分析:时间+空间,简洁一行
  6. 其他语言:Python3、Java、Go、JS,按此顺序
  7. 与代码随想录联系:Hot100 特色板块,引导回主站体系学习

# 三、思路写法

# 核心原则:先抛问题,逐步引导

不要上来就给答案,而是先让读者思考,再一步步分析。

# 推荐模式

模式A:暴力→优化(适合有暴力解的题目)

暴力解法是两层for循环,时间复杂度O(n²)。

但我们可以用xxx方法优化:
[分析为什么可以优化]
[引出最优解法]
1
2
3
4
5

模式B:特征→映射→数据结构(适合哈希/映射类题目)

本题本质是要[做什么]。

这就需要[某种映射/操作]。

想到映射,就应该想到[哈希表/某种数据结构]。

那么用什么样的[哈希表]呢?
[分析不同选择的优劣]
1
2
3
4
5
6
7
8

模式C:模板套用(适合回溯/DP类题目)

回溯三部曲:
1. 递归函数参数
2. 递归终止条件
3. 单层搜索逻辑

动规五部曲:
1. 确定dp数组及下标含义
2. 确定递推公式
3. dp数组初始化
4. 确定遍历顺序
5. 举例推导dp数组
1
2
3
4
5
6
7
8
9
10
11

# 思路中的关键手法

  1. 设问引导:先问"为什么""什么时候",再回答

    • "什么时候需要startIndex呢?"
    • "为什么会想到用哈希表?"
    • "map中key和value分别表示什么?"
  2. 加粗关键结论:让读者一眼看到核心要点

    • 本题还需要startIndex来控制for循环的起始位置
    • 对总集合排序之后,如果下一层的sum已经大于target,就可以结束遍历
    • 这道题目中并不需要key有序,选择std::unordered_map效率更高
  3. 关联前题:自然带出之前做过的相关题目,帮助建立体系

  4. 对比分析:不同方法/数据结构的对比

    • "数组 vs set vs map"三种哈希法的适用场景
    • "回溯法 vs 贪心法"的思路差异

# 四、模拟过程写法

这是 Hot100 题解的特色板块,用具体数据一步步走算法流程。

# 要点

  • 选一个具体示例(优先用力扣给的示例1)
  • 每一步写清楚当前状态
  • 配图可以多张,不需要一张图讲完整个流程——把过程拆成多个阶段,每个阶段配一张图,逐步推进
  • 文字描述和图片交替出现,图紧跟对应的文字说明

# 连续算法状态图规范

模拟算法执行过程时,默认采用 一张图展示一个关键步骤,不要把初始化、指针移动、命中答案、去重和结束条件全部压进一张总览图。

拆图时优先保留以下关键状态:

  1. 输入变换与初始化,例如排序、建立窗口、初始化指针
  2. 条件判断引起的移动,例如 sum < 0left++
  3. 命中答案或产生有效状态
  4. 命中后的指针更新、窗口收缩或状态转移
  5. 去重、剪枝、跳过等容易写错的控制点
  6. 终止条件与最终结果

连续多张图还要遵守以下规则:

  • 画布尺寸、数组位置、节点大小、指针标签和 Logo 位置保持一致,让录友像看动画帧一样阅读
  • 每张图只高亮本步骤发生变化的元素,未变化或已经处理过的元素使用灰色弱化
  • 颜色语义保持一致,例如黄色表示固定元素、蓝色表示活动指针、绿色表示命中、红色表示去重或无效路径、紫色表示结果
  • 箭头必须表达明确动作,例如 left++right--、记录答案、跳过本轮,不能只表示模糊的“下一步”
  • 只画有新信息的关键步骤;连续执行同一规则的机械移动可以在正文中概括,不需要为每一次循环单独画图
  • 文件名使用两位步骤编号,例如 0015.三数之和-01-排序与初始化.drawio

例如三数之和可以拆成:排序与初始化 → left 右移 → 命中第一个三元组 → 收缩后再次命中 → 固定元素去重 → right 左移并结束。

# 示例(49.字母异位词分组)

## 模拟过程如下:

eat 排序后为 aet,将 eat 放在 key 为 aet 的 map 中:

<img src='xxx.png' width=800>

tea 排序后为 aet,将 tea 放在 key 为 aet 的 map 中:

<img src='xxx.png' width=800>

……

最后,map 就根据 key,帮我们分门别类,将所有字符串按照字母异位词分组。
1
2
3
4
5
6
7
8
9
10
11
12
13

# 五、代码写法

# C++ 代码规范

  • class Solution 包裹(力扣格式)
  • 注释用中文
  • 注释精炼,只写"为什么"和"关键点",不写显而易见的"是什么"
  • 关键行用行内注释 // 关键点:xxx

# 代码中的注释风格

// 好的注释(写为什么/关键点)
backtracking(candidates, target, sum, i); // 不用i+1了,表示可以重复读取当前的数

// 坏的注释(写显而易见的事)
backtracking(candidates, target, sum, i); // 调用回溯函数
1
2
3
4
5
// 好的注释(解释策略选择)
auto iter = map.find(target - nums[i]); // 遍历当前元素,在map中寻找是否有匹配的key

// 坏的注释(重复代码含义)
auto iter = map.find(target - nums[i]); // find target - nums[i]
1
2
3
4
5

# 其他语言

按 Python3 → Java → Go → JS 顺序排列,每个语言用 ### 三级标题。

代码块语言标记小写:```python```java```go```javascript


# 六、语气与用词

# 称呼读者

  • 用"录友"或"录友们",不用"同学们""大家""读者"
  • 例:"很多录友把这道题目通过了,但都没想清楚map是用来做什么的"

# 口语化但不随意

  • 允许口语化表达,但保持专业
  • 好的:"吓得我赶紧想想出现0可咋办"
  • 好的:"很明显暴力的解法是两层for循环"
  • 避免过于正式:"综上所述""由此可见""不难发现"

# 语气特点

  • 直接干练:不绕弯子,直接说重点
  • 设问引导:用问题引发思考,而非直接灌输
  • 自嘲幽默:偶尔有轻松的表达调节节奏
  • 鼓励感:让读者觉得"我能理解"

# 典型句式

场景 句式
引出方法 "那么就应该想到xxx了"
强调关键 "这一点很重要" / "注意xxx"
设问引导 "为什么会想到用xxx?" / "什么时候需要xxx呢?"
对比前题 "本题和xx.题名的区别是……"
总结要点 "想清楚以下几点,本题才算理解透彻"
提醒易错 "很多录友xxx,但其实xxx"
鼓励读者 "相信结合视频再看本篇题解,更有助于大家对本题的理解"

# 七、图片规范

# 格式

使用 <img> 标签,不用 markdown 的 ![]() 语法:

<img src='https://file1.kamacoder.com/i/web/xxx.png' width=800>
1

# 配图原则

  • 模拟过程可以多张图,不需要一张图讲完整个流程,把过程拆成多个阶段逐步推进
  • 宽度统一 width=800
  • 思路中的图,用于说明树形结构、流程、状态变化
  • 每张图紧跟对应的文字说明
  • 所有 drawio 配图都必须带“代码随想录”Logo
  • Logo 默认放在左下角等空白区域,保持原始宽高比,不拉伸、不裁切,不能遮挡正文、箭头和关键状态
  • 可从 docs/pics/algo/0438.找到字符串中所有字母异位词-定长窗口.drawio 中复制已经内嵌的 Logo 图层

# Logo 防变形规范

Logo 变形通常不是源图问题,而是 draw.io 图片节点关闭了宽高比保护,或者 mxGeometry 的宽高比例与源图不一致。

添加 Logo 时必须遵守:

  1. 优先复制已有 drawio 中内嵌的 Logo 图层,避免外链图片在离线导出时加载失败

  2. 导入新的 Logo 前先确认源图像素尺寸,按原始比例计算展示尺寸:

    sips -g pixelWidth -g pixelHeight logo.png
    
    1

    计算公式:展示高度 = 展示宽度 × 原图高度 ÷ 原图宽度

  3. draw.io 图片节点必须开启图片宽高比保护:

    style="shape=image;imageAspect=1;aspect=fixed;..."
    
    1
  4. 禁止使用 imageAspect=0aspect=fixed 只能固定图片框的比例,不能抵消 imageAspect=0 对图片内容的拉伸

  5. mxGeometrywidthheight 必须接近源图比例。例如 Logo 原图为 666 × 658,可以使用 120 × 119,不能使用 175 × 75

  6. 调整 Logo 尺寸后要同步检查坐标,确保没有触碰画布边缘,也没有遮挡正文和箭头

# 图片工作流

  1. 先规划拆图步骤:列出每张图要表达的唯一动作或状态变化,连续图使用 0102 等两位编号
  2. 再画 drawio:在 docs/pics/algo/ 下创建 .drawio 文件,单图命名格式为 NNNN.题目关键词-说明.drawio,连续图命名格式为 NNNN.题目关键词-步骤编号-说明.drawio
  3. 添加代码随想录 Logo:放在不干扰图解内容的空白区域,使用 imageAspect=1 并按源图比例设置尺寸
  4. 校验 drawio 源文件:使用 xmllint --noout 文件名.drawio 检查 XML 结构
  5. markdown 中先放 drawio 文件名占位:每段步骤说明后紧跟对应图片占位,等卡哥确认 drawio 内容
  6. 逐张导出临时 PNG 并目检:检查文字、箭头、颜色、Logo 比例、遮挡和裁切;连续图必须每张都检查,不能只抽查第一张
  7. 卡哥确认后:导出为 JPG → 上传卡码图床 → 用图床 URL 替换占位
  8. 最终格式:<img src='https://file1.kamacoder.com/i/web/xxx.jpg' width=800>

# draw.io 导出失败排查

xmllint 校验通过只代表 XML 结构合法,不代表 draw.io 一定能够正常渲染。遇到 Export failed 时按以下顺序排查:

  1. 检查 Logo 等外链图片是否加载成功;正式源文件优先使用内嵌图片
  2. 检查连接器的 sourcetarget ID 是否存在且唯一,尽量先定义节点,再定义引用节点的连接器
  3. 如果只是表示“排序”“转换”等简单方向,不需要绑定两个节点,可以使用独立的 singleArrow 图形,减少连接器兼容问题
  4. 修改后必须重新导出并目检,不能因为 XML 校验通过就跳过渲染检查

# 八、"与代码随想录联系"写法

这是 Hot100 特色板块,目的是把 Hot100 题目和主站体系关联起来。

# 内容要点

  1. 说明本题对应主站哪个章节/哪道题
  2. 提供主站链接(用 .html 格式)
  3. 简要说明主站相关章节能学到什么
  4. 如果有相似思路的前题,列出关联

# 示例

## 与代码随想录联系

我在代码随想录哈希表章节里,详细讲解过,什么时候用数组,什么时候用set,什么时候用map。

如果想进一步学习,可以看一下[代码随想录哈希表章节](链接),刷前四节,就可以理解了。

同时大家在做这道题目的时候,一定会想到,代码随想录哈希表章节:[242.有效的字母异位词](链接)。
1
2
3
4
5
6
7

# 九、不同题型写作要点

# 哈希表题

  • 先讲"为什么会想到哈希"(查询元素是否出现过)
  • 再分析用什么哈希结构(数组 vs set vs map)
  • 最后讲 key/value 怎么设计

# 双指针题

  • 先讲暴力解法
  • 分析为什么可以优化(单调性/有序性/对撞性质)
  • 给出双指针的移动逻辑

# 回溯题

  • 用"回溯三部曲"框架
  • 画树形结构图
  • 重点讲剪枝优化
  • 对比和前题的差异(startIndex?used数组?)

# 动态规划题

  • 用"动规五部曲"框架
  • 重点讲dp数组含义和递推公式
  • 用矩阵/表格图推导过程
  • 分析初始化的合理性

# 贪心题

  • 先讲"局部最优→全局最优"的思路
  • 用反例说明为什么贪心有效
  • 配图说明覆盖范围/跳跃过程

# 二叉树题

  • 明确遍历方式(前中后序/层序)
  • 画图说明递归过程
  • 讲清楚递归函数的参数和返回值

# 单调栈题

  • 先讲暴力解法
  • 分析"单调性"是如何产生的
  • 用柱状图/温度图模拟入栈出栈过程

# 十、写作检查清单

写完题解后,对照以下清单检查:

  • [ ] Frontmatter 的 title 包含题号、题目名、核心算法、Hot100
  • [ ] 有力扣题目链接
  • [ ] 题目描述从力扣原文摘录,含示例和提示
  • [ ] 思路部分有设问引导,不只给答案
  • [ ] 关键结论用加粗
  • [ ] 有模拟过程板块,配图逐步演示(可多张图,不必一张讲完)
  • [ ] 连续模拟图做到一张图一个关键步骤,并保持画布、节点、颜色和 Logo 位置一致
  • [ ] C++ 代码注释用中文,注释写"为什么"而非"是什么"
  • [ ] 有复杂度分析
  • [ ] 有其他语言版本(Python3/Java/Go/JS)
  • [ ] 有"与代码随想录联系"板块
  • [ ] 称呼读者用"录友"
  • [ ] 图片用 <img> 标签,width=800
  • [ ] 所有 drawio 配图都带代码随想录 Logo,且 Logo 未变形、无遮挡
  • [ ] Logo 使用 imageAspect=1mxGeometry 宽高比例与源图一致
  • [ ] 每一个 drawio 都已实际导出并逐张目检,没有文字重叠、箭头错位或内容裁切
  • [ ] 先画 drawio 放 docs/pics/algo/,确认后再导出上传卡码图床
上次更新:: 7/23/2026, 8:59:54 PM

评论

验证登录状态...