Imported from Westlife-Engineering/Leetcode-Practice (
AGENTS.md). Install upstream withnpx skills add Westlife-Engineering/Leetcode-Practice. Copyright stays with the author.
AGENTS.md
本文件用于指导在本仓库中工作的 AI 编码助手(Codex、Cursor、Gemini 等)。 所有 agent 在动手之前应先完整阅读本文件。
仓库性质
这是一个 LeetCode 刷题与基础数据结构复习笔记仓库,不是软件项目。
- 没有构建系统、没有依赖、没有测试套件。
- 内容以 Markdown 笔记和少量示例代码为主。
- 主要使用者是仓库主人本人,用于记录做题过程、思路、疑惑和复盘,以及准备基础 C++ 编程考核。
请按"个人学习笔记仓库"而不是"工程项目"来理解后续所有规则。
目录结构
LeetCode 笔记按 算法题型 分文件夹组织,每个题型一个中文目录;基础编程考核资料独立放在 数据结构复习/:
Leetcode-Practice/
├── AGENTS.md # 本文件
├── 哈希/ # 哈希表相关题目
├── 双指针/ # (按需新建)
├── 滑动窗口/
├── 链表/
├── 数据结构复习/ # 基础实现,目标环境 VS2010
│ ├── 线性结构.md
│ ├── 树.md
│ └── 图.md
├── ...
题型目录命名约定:
- 用 中文 命名,与 LeetCode 中文站专题分类对齐(哈希、双指针、滑动窗口、子串、普通数组、矩阵、链表、二叉树、图论、回溯、二分查找、栈、堆、贪心、动态规划、多维动态规划、技巧)。
- 一题属于多个题型时,放入最贴切的那一个,不要重复存放。
标签 → 目录(自动落盘)
主人贴出力扣题目链接、需要新建笔记时:按题目页标签自动选择目录并创建文件,不必先问文件名/归属(与 .cursor/skills/leetcode-note/SKILL.md 一致)。
| 力扣标签(含近似) | 目录 |
|---|---|
| 滑动窗口 | 滑动窗口/ |
| 双指针 | 双指针/ |
| 哈希表 | 哈希/ |
| 子串 | 子串/ |
| 数组(且无明显更高阶技巧) | 普通数组/ |
| 矩阵 | 矩阵/ |
| 链表 | 链表/ |
| 二叉树、二叉树遍历等 | 二叉树/ |
| 图、深度优先搜索、广度优先搜索(偏图) | 图论/ |
| 回溯 | 回溯/ |
| 二分查找 | 二分查找/ |
| 栈、单调栈 | 栈/ |
| 堆(优先队列) | 堆/ |
| 贪心 | 贪心/ |
| 动态规划 | 动态规划/ |
| 动态规划且明显多维/区间/状压等 | 多维动态规划/ |
| 位运算、数学等技巧向 | 技巧/ |
多标签优先级(从高到低,命中即选):
- 滑动窗口 / 双指针 / 二分查找 / 回溯 / 单调栈·栈 / 堆
- 动态规划 / 多维动态规划 / 贪心
- 链表 / 二叉树 / 图论 / 矩阵
- 哈希表 →
哈希/ - 子串 / 字符串 / 数组 →
子串/或普通数组/(字符串题且标签含「子串」用子串/;否则看是否更像哈希/窗口)
示例:标签 = 哈希表、字符串、滑动窗口 → 滑动窗口/。
- 目录不存在:直接新建(中文名)。
- 仅当标签无法映射、或两个同级技巧标签难分时,才向主人确认目录。
- 目标文件已存在:不要覆盖;告知路径并询问是否更新。
LeetCode 笔记文件规范
每道题一个 Markdown 文件,放在对应题型目录下。
文件名:<题号>-<题名简写>.md,例如 49-字母异位词分组.md、1-两数之和.md。
推荐模板:
# <题号> <题名>
- 难度:
- 标签:
- 力扣链接:<题目 URL>
## 题目描述
(粘题目原文,含示例和数据范围)
## 思路
(第一遍做时的真实思路,包括走过的弯路。复盘时再补充更优解法。)
## 代码
\`\`\`cpp
// 贴自己的解法,关键 STL 用法必须有详细注释
\`\`\`
## 复杂度
- 时间:
- 空间:
## 疑惑 / 卡点
(做的时候哪里没想明白、查了什么资料、踩了什么坑)
## 复盘
(事后总结:有没有更优解、易错点、可迁移的套路)
模板是建议而非强制,缺章节没问题,但每篇笔记至少要有「题目描述 / 思路 / 代码」三块。
主人要求机试拓展时:不要改上面这些原有章节,只在文末追加 ## 拓展:…。写法见下方「机试拓展(续写已有笔记)」。样板:哈希/1-两数之和.md 文末那一节。
代码风格
笔记里贴的代码遵循:
- LeetCode 笔记默认语言 C++(C++17 标准),如用其他语言请标注;
数据结构复习/的兼容性要求见下节,不使用此默认标准。 - LeetCode 正文主解贴提交版本(含
Solution类和指定方法签名),不要随意改名;要能直接复制到力扣运行,#include按力扣默认环境省略即可。 - 机试拓展不走力扣签名:必须带齐自己会写到的头文件、
main、读入输出;整段能贴进练习/playground.cpp编译跑。不要把拓展代码伪装成可交力扣的Solution。 - STL 注释必须详细。主人对 C++ STL 还不熟悉,凡是用到 STL 的地方都要写清用法,包括:
- 容器/算法的签名和含义(例:
unordered_map<string, vector<string>>表示「key 是字符串、value 是字符串数组的哈希表」)。 - 关键方法的参数和返回值(例:
mp[key]不存在时会自动创建空 value;emplace_back()比push_back()少一次拷贝)。 - 容易踩坑的点(例:
sort(s.begin(), s.end())是就地排序,会修改原字符串,需要先拷贝;count用[](auto& a, auto& b){...}这种 lambda 时要注意捕获方式)。 - 常见的时间复杂度含义(例:
unordered_map查找 O(1) 均摊,map查找 O(log n))。
- 容器/算法的签名和含义(例:
- 注释贴近代码行,不另起大段说明;关键步骤可加一行短注释,避免逐行翻译成自然语言。
数据结构复习(基础编程考核)
本节仅适用于 数据结构复习/。这里按知识板块组织,不套用 LeetCode 的题号命名、官方题解、Solution 签名、单一主解和机试拓展文末追加规则;已有内容仍须主人明确要求才能修改。目标是掌握基础数据结构和经典算法的 C++ 实现,不扩展成高难度竞赛题集。
| 文档 | 必须保留的覆盖范围 |
|---|---|
| 数据结构复习/线性结构.md | 栈、队列、优先级队列的 STL 用法;顺序栈、循环队列及简单应用 |
| 数据结构复习/树.md | 二叉树类、前中后序及层序遍历;前序加中序、中序加后序的哈希索引重建;BST、哈夫曼树;堆的上滤、下滤、两种建堆及插入删除 |
| 数据结构复习/图.md | 邻接矩阵、邻接表;BFS、DFS、简单路径和无权最短路;Prim、Kruskal、Dijkstra、Floyd 及路径还原 |
- 兼容 Microsoft Visual Studio 2010。 使用基础常用 STL,如
vector、stack、queue、priority_queue、unordered_map、map、set。VS2010 已提供<unordered_map>,可以用它保存二叉树中序索引,并注明重建是期望线性时间、散列冲突时可能退化。 - 采用保守语法。 使用显式类型、普通
for、push_back、普通构造函数和函数对象;嵌套模板写> >,空指针统一用0或NULL,vector示例用 C 数组加区间构造。不使用范围for、容器列表初始化、auto、lambda、emplace、智能指针、constexpr、= delete/default、bits/stdc++.h等写法;long long在 VC2010 可用。 - 代码块可以独立运行。 每个
cpp代码块都带齐头文件、类或函数以及恰好一个演示main,不依赖其他代码块、隐含辅助函数或省略实现。不同程序分开编译,附固定样例和预期输出;说明 VS2010 预编译头设置与中文源文件编码,不要求工程工具链。 - 解释服务于实现。 关键 STL 用法继续遵守就近详细注释要求;配少量思路、接口与返回结果、复杂度和易错点。明确空结构、重复值、不可达、负权和负环等适用边界,不混淆最小生成树与最短路径。
- 所有权和失败状态明确。 使用
new/delete的树类提供销毁逻辑,并通过私有声明但不实现复制构造和赋值来禁止浅拷贝,或显式实现深拷贝。说明重建失败后的状态、失败操作是否改写输出参数;STL 取值和弹出前必须判空。 - 验证完整示例。 使用已有编译器,将代码块提取到系统临时目录,编译、运行、核对输出及边界断言;不覆盖已有练习源码,不向仓库加入构建产物或测试工具链。产生必要副作用的操作不要放进
assert,避免定义NDEBUG后被跳过。 - 如实记录兼容性验证。 审查目标编译器支持的语法和库;报告实际使用的编译器及检查结果,不把现代 MSVC 编译通过等同于 VS2010 实测。没有目标环境时明确说明。
- 分工后统一审核。 主人授权时可以按三个板块使用同模型子代理;主代理负责审核覆盖范围、难度、实现、兼容性和示例验证,不能未经检查直接交付。
机试拓展(续写已有笔记)
主人会在已有力扣笔记上做变体续写,目的是准备机试:算法往往还是原来那个,但假设、返回类型、I/O、下标约定会变。练习时任何实现细节都不能略过,不能只讲思路。
触发:主人说「拓展」「机试变体」「改返回值 / 改成多组答案」等,并点名某篇 .md。未点名时不要给每道题自动加拓展。
落盘方式
- 只在该笔记文末追加,章节名
## 拓展:<变体一句话>。原文(题目描述 / 思路 / 代码 / 复盘等)只读不改。 - 不要新建第二份题文件,不要覆盖原主解。同一篇可以有多节拓展,后写的继续往文末接。
- 样板结构对齐
哈希/1-两数之和.md文末,按题裁剪,不要空套:
## 拓展:<变体标题>
(和原题差在哪;默认题意写死,有歧义先写清假设)
### 思路
(算法哪里没变;类型 / 表结构 / 控制流哪里变了;最好补一手算)
### 返回类型怎么选(机试必看)
(函数只能 return 一个对象时怎么带出多个结果;力扣签名 vs 自己写 main)
### 代码
(一份完整可编译主代码:#include + 函数 + 演示 main)
### 复杂度
(对照原题;答案规模变大时时间和空间怎么变)
### 和原题对比时最容易写错的地方
(类型写错、提前 return、[] 插入、下标 0/1、输出格式等)
(文末给几组自测数据和期望输出)
写拓展时必须交代的内容
- 默认题意先钉死。 变体常有歧义(例如「所有下标组合」vs「每个元素最多用一次」)。选定一个默认,举例说明;另一种点明「换题、换算法」,不要混在一份代码里。
- 对照原题写差异,不要重讲一遍原算法。 典型差异:唯一解 → 多组;找到就
return→ 记下来继续扫;map<K,V>覆盖 →map<K, vector<V>>追加;vector<int>→vector<vector<int>>/pair。 - 返回类型单独讲清楚。 机试里这是高频失分点。写清常见三种:只返回容器、用
.size()当组数;pair打包两个值;引用传出。主代码选一种把类型写完整,必要时再附更短变体,不要并列三四套算法。 - 代码按「自己从零写」来给。 带
#include、using namespace std;、完整函数、能跑的main(先写死示例;另附一段cin读入骨架即可)。点明:力扣不给main、机试要自己写;下标可能是 0-based 或 1-based,输出格式先看题。 - STL / 语法细节按正文同一标准详注。 拓展里新出现的类型(
pair、vector<vector<int>>、size_t转int、范围 for、const auto&等)也要写清签名、副作用、踩坑。主人要练的是能默写,不是只懂思路。 - 复杂度按变体重写。 组数 / 输出规模上去之后,不要沿用原题口头上的 O(n)。
- 易错点必须「和原题对比」。 原题能 AC 的写法(提前
return、mp[k]=i覆盖、一维数组装多组下标)在变体里会错,逐条写出来。 - 给能手跑的自测。 含原题样例(应变出 1 组)和能打出差异的新样例。
和正文规则的关系
- 「不要重构已有笔记」仍然成立:拓展是追加,不是改原文、不是润色旧章节。
- 「正文只放一份主解」仍然成立:拓展的机试代码放在文末,不塞进原「代码」节。
- 「不要捏造题目内容」对变体仍然成立:按主人描述的变体写;不要写成力扣官方原题,也不要编一套没说过的数据范围。
Agent 行为规则
以下是对在本仓库工作的 agent 的硬性要求:
- 不要重构已有笔记。 已存在的
.md文件除非主人明确要求修改,否则只读不写。发现错别字、格式瑕疵也不要擅自改。主人要求机试拓展时,只允许文末追加,仍不算可以改原文。 - 按标签自动新建笔记。 主人给出力扣链接需要初稿时:抓取题目原文与官方题解,按上方「标签 → 目录」自动落盘
<题号>-<题名简写>.md,目录不存在则新建;不必先问文件名。细则见.cursor/skills/leetcode-note/SKILL.md。仅标签无法映射或同级难分时才确认。 - LeetCode 题解正文只放一份主解法。 正文放与目录主题对应的官方主解(或主人指定解法);多种解法放到「复盘」章节,不要并列贴三四份代码。机试拓展另写一份完整可编译主代码,放在文末,不要塞进原「代码」节。
数据结构复习/按上方专节组织多个独立程序。 - 不要捏造题目内容。 主人每次做题都会附上力扣题目链接,只根据主人贴的链接抓取题目原文来写笔记;主解优先参考力扣官方题解 / 官方阅读文章,不要凭记忆或从其他来源拼凑题目。变体按主人描述写,不要写成官方原题。
- STL 注释必须详细。 见上方「代码风格」章节。主人不熟悉 C++ STL,所有 STL 用法都要写清签名、含义、关键方法、踩坑点、复杂度,宁可注释啰嗦也不要省略。机试拓展同样适用,细节不能因为「算法没变」就省略。
- 尊重中文目录命名。 新建题型目录用中文,和现有
哈希/保持一致。 - 不要引入任何工具链。 不要新建
package.json、CMakeLists.txt、CI 配置、.gitignore模板等,除非主人要求。 - Git 写操作须经授权。 本仓库已使用 Git。只有主人明确要求时才提交、推送或创建/切换分支;执行前检查状态和差异,只纳入当前任务相关文件,不夹带或覆盖其他改动。不要擅自执行
git init、重置历史或强制推送。 - 机试拓展按专节续写。 主人点名某篇笔记做机试变体时,遵守上方「机试拓展(续写已有笔记)」:文末追加、对照原题写差异、返回类型 / I/O / 下标单独讲、代码带
#include和main、给对比易错点和自测。样板见哈希/1-两数之和.md。未点名不要自动加拓展。
当前状态
- 已有题型目录与笔记(如
哈希/、双指针/、滑动窗口/等),按题持续增补。 - 新建笔记流程与项目 skill
leetcode-note对齐:链接 → 抓题 + 官方题解 → 按标签自动落盘。 - 已有笔记可按主人要求在文末追加机试拓展(样板:
哈希/1-两数之和.md),原文不动。 - 已有
数据结构复习/,分为线性结构、树、图三篇,面向 VS2010 的基础实现与经典算法复习。 - 已使用 Git,提交和推送遵循上方授权规则。
变更本文件
本文件本身可以随仓库演进调整。修改本文件时,在对话里说明改了哪几条、为什么改。
