Skip to content

About

学习 TypeScript 算法。使用 VSCode 刷 LeetCode,Vitest 单测,以及开箱即用的编辑器 debug 配置。

Topics

Resources

Stars

20 stars

Watchers

1 watching

Forks

Repository files navigation

TypeScript · LeetCode 题解

用 TypeScript 刷 LeetCode 的长期记录 —— 逐题的类型定义、中文思路注释与单元测试

TypeScript Vitest pnpm Node.js LeetCode

14 个算法分类 · 持续更新中


📖 这是什么

一个的 LeetCode 刷题仓库。每道题一个文件,结构固定:

  • 题目描述 —— 文件顶部的 TSDoc,写清原题要点与参数含义
  • 实现 —— 单一函数,export default 导出,便于测试直接引入
  • 思路注释 —— 关键步骤逐行中文注释,说明为什么这样写,而不只是写做了什么
  • 结构定义 —— 题目需要的 ListNode / TreeNode 就近声明;跨题复用的放在 src/data-structure

不追求一行流的最短解,追求半年后回看还能看懂。

📊 分类分布

分类 题量 分布
二叉树 28 ██████████████████
动态规划 27 █████████████████
链表 16 ██████████
回溯 11 ███████
数组 10 ██████
栈与队列 10 ██████
字符串 9 ██████
双指针 8 █████
哈希表 6 ████
二分查找 6 ████
排序专题 6 ████
贪心 5 ███
前缀和与差分 4 ███
其他 4 ███

下表题量随刷题进度变化,仅作分布快照。

两个归档维度:分类目录按算法归档(一题一类);题库目录按出处归档 (leetcode-hot-100 / 剑指 Offer,内部再分二级类)。两者有部分题目重复 —— 同一道题在两处各存一份,方便按不同线索找回。

🚀 快速开始

环境要求:Node ≥ 24、pnpm ≥ 10(见 .node-version 与 package.json#engines)。

pnpm install

pnpm test          # 运行全部测试(vitest run)
pnpm test:watch    # 监听模式,改完即测

调试题解:用 VSCode 打开任意题目文件 → F5 → 选择 node.js 配置。 用的是 Node 原生调试器,不需要 ts-node / tsx 中转,可直接断点 (launch.json 里还保留了 esno、tsx 两种备用配置)。

📁 目录结构

src/
├── data-structure/            公共结构:ListNode · TreeNode · DLinkedNode
│
├── 数组/  链表/  哈希表/  字符串/  双指针/  栈与队列/           基础结构
├── 二分查找/  排序专题/  前缀和与差分/                          常用技巧
├── 二叉树/                      含 5 个二级类:遍历 / 属性 / 修改与构造 / 二叉搜索树 / 公共祖先
├── 回溯/                        含 3 个二级类:组合 / 排列 / 子集
├── 动态规划/                     含 4 个二级类:0-1 背包 / 完全背包 / 子序列 / 打家劫舍
├── 贪心/   其他/
│
├── leetcode-hot-100/          题库维度:热题 100(再分 11 个二级类)
└── 剑指 Offer/                 题库维度:剑指 Offer(再分 12 个二级类)

🧱 公共数据结构

题目里反复用到的三个节点类,放在 src/data-structure/:

export default class ListNode {
    public val: number;
    public next: ListNode | null;
    constructor(val: number, next: ListNode | null = null) {
        this.val = val;
        this.next = next;
    }
}
export default class TreeNode {
    public val: number;
    public left: TreeNode | null;
    public right: TreeNode | null;
    constructor(val: number, left: TreeNode | null = null, right: TreeNode | null = null) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

另有 DLinkedNode(带前后指针的双向节点)。题目特有的结构(如带 random 指针的 Node)就近写在题目文件里,避免为一道题污染公共目录。

📚 经典题索引

下面是按分类整理的经典题(题名直达源码文件,短链跳 LeetCode 原题); src/ 下实际收录的题解更多,这里挑的是最有代表性的那些。 想找别的题,直接浏览对应分类目录即可。

二分查找

题目 原题
704. 二分查找 binary-search
35. 搜索插入位置 search-insert-position
367. 有效的完全平方数 valid-perfect-square
69. x 的平方根 sqrtx
50. Pow(x, n) powx-n
34. 在排序数组中查找元素的第一个和最后一个位置 find-first-and-last-position-of-element-in-sorted-array

数组

题目 原题
1. 两数之和 two-sum
56. 合并区间 merge-intervals
27. 移除元素 remove-element
977. 有序数组的平方 squares-of-a-sorted-array
88. 合并两个有序数组 merge-sorted-array
209. 长度最小的子数组 minimum-size-subarray-sum
54. 螺旋矩阵 spiral-matrix
59. 螺旋矩阵 II spiral-matrix-ii
200. 岛屿数量 number-of-islands

链表

题目 原题
203.移除链表元素 remove-linked-list-elements
21. 合并两个有序链表 merge-two-sorted-lists
707. 设计链表 design-linked-list
141. 环形链表 linked-list-cycle
142. 环形链表 II linked-list-cycle-ii
206. 反转链表 reverse-linked-list
92. 反转链表 II reverse-linked-list-ii
24. 两两交换链表中的节点 swap-nodes-in-pairs
160. 相交链表 intersection-of-two-linked-lists
83. 删除排序链表中的重复元素 remove-duplicates-from-sorted-list
82. 删除排序链表中的重复元素 II remove-duplicates-from-sorted-list-ii
19. 删除链表的倒数第 N 个结点 remove-nth-node-from-end-of-list
138. 复制带随机指针的链表 copy-list-with-random-pointer
2. 两数相加 add-two-numbers

哈希表

题目 原题
202. 快乐数 happy-number
242. 有效的字母异位词 valid-anagram
383. 赎金信 ransom-note
349. 两个数组的交集 intersection-of-two-arrays
454. 四数相加 II 4sum-ii
347. 前 K 个高频元素 top-k-frequent-elements

字符串

题目 原题
344. 反转字符串 reverse-string
541. 反转字符串 II reverse-string-ii
459. 重复的子字符串 repeated-substring-pattern
05. 最长回文子串 longest-palindromic-substring
125. 验证回文串 valid-palindrome
680. 验证回文串 II valid-palindrome-ii
151. 反转字符串中的单词 reverse-words-in-a-string
211. 添加与搜索单词 design-add-and-search-words-data-structure
28. 找出字符串中第一个匹配项的下标 find-the-index-of-the-first-occurrence-in-a-string

双指针

题目 原题
15. 三数之和 3sum
11. 盛最多水的容器 container-with-most-water
27. 移除元素 remove-element
344. 反转字符串 reverse-string
392. 判断子序列 is-subsequence
26. 删除有序数组中的重复项 remove-duplicates-from-sorted-array
80. 删除有序数组中的重复项 II remove-duplicates-from-sorted-array-ii

栈与队列

题目 原题
20. 有效的括号 valid-parentheses
155. 最小栈 min-stack
232. 用栈实现队列 implement-queue-using-stacks
225. 用队列实现栈 implement-stack-using-queues
150. 逆波兰表达式求值 evaluate-reverse-polish-notation
1047. 删除字符串中的所有相邻重复项 remove-all-adjacent-duplicates-in-string
739. 每日温度 daily-temperatures
239. 滑动窗口最大值 sliding-window-maximum

二叉树

二叉树的遍历

题目 原题
144. 二叉树的前序遍历 binary-tree-preorder-traversal
94. 二叉树的中序遍历 binary-tree-inorder-traversal
145. 二叉树的后序遍历 binary-tree-postorder-traversal
102. 二叉树的层序遍历 binary-tree-level-order-traversal

二叉树的属性

题目 原题
101. 对称二叉树 symmetric-tree
104. 二叉树的最大深度 maximum-depth-of-binary-tree
111. 二叉树的最小深度 minimum-depth-of-binary-tree
222. 完全二叉树的节点个数 count-complete-tree-nodes
110. 平衡二叉树 balanced-binary-tree
257. 二叉树的所有路径 binary-tree-paths
404. 左叶子之和 sum-of-left-leaves
513. 找树左下角的值 find-bottom-left-tree-value
112. 路径总和 path-sum

二叉树的修改与构造

题目 原题
226. 翻转二叉树 invert-binary-tree
617. 合并二叉树 merge-two-binary-trees
105. 从前序与中序遍历序列构造二叉树 construct-binary-tree-from-preorder-and-inorder-traversal
106. 从中序与后序遍历序列构造二叉树 construct-binary-tree-from-inorder-and-postorder-traversal
654. 最大二叉树 maximum-binary-tree

二叉搜索树

题目 原题
700. 二叉搜索树中的搜索 search-in-a-binary-search-tree
701. 二叉搜索树中的插入操作 insert-into-a-binary-search-tree
450. 删除二叉搜索树中的节点 delete-node-in-a-bst
98. 验证二叉搜索树 validate-binary-search-tree
108. 将有序数组转换为二叉搜索树 convert-sorted-array-to-binary-search-tree
1382. 将二叉搜索树变平衡 balance-a-binary-search-tree
530. 二叉搜索树的最小绝对差 minimum-absolute-difference-in-bst
501. 二叉搜索树中的众数 find-mode-in-binary-search-tree

二叉树公共祖先问题

题目 原题
235. 二叉搜索树的最近公共祖先 lowest-common-ancestor-of-a-binary-search-tree
236. 二叉树的最近公共祖先 lowest-common-ancestor-of-a-binary-tree

动态规划

题目 原题
509. 斐波那契数 fibonacci-number
70. 爬楼梯 climbing-stairs
746. 使用最小花费爬楼梯 min-cost-climbing-stairs
96. 不同的二叉搜索树 unique-binary-search-trees
剑指 Offer II 091. 粉刷房子 JEj789
62. 不同路径 unique-paths
63. 不同路径 II unique-paths-ii
343. 整数拆分 integer-break

0 - 1 背包

题目 原题
416. 分割等和子集 partition-equal-subset-sum

完全背包

题目 原题
322. 零钱兑换 coin-change
139. 单词拆分 word-break
279. 完全平方数 perfect-squares

子序列问题

题目 原题
674. 最长连续递增序列 longest-continuous-increasing-subsequence
300. 最长递增子序列 longest-increasing-subsequence
718. 最长重复子数组 maximum-length-of-repeated-subarray
1143. 最长公共子序列 longest-common-subsequence
53. 最大子数组和 maximum-subarray

回溯

题目 原题
46. 全排列 permutations
77. 组合 combinations
78. 子集 subsets
17. 电话号码的字母组合 letter-combinations-of-a-phone-number
22. 括号生成 generate-parentheses
39. 组合总和 combination-sum
216. 组合总和 III combination-sum-iii

排序算法专题

🧪 测试

用 Vitest(globals 模式,配置见 vitest.config.ts), 测试文件按目录就近放在 __test__/ 下,目前覆盖:

二分查找 · 数组 · 字符串 · 哈希表 · 栈与队列 · 栈与队列/单调栈 · 排序专题 · 动态规划/完全背包 · 动态规划/打家劫舍 · leetcode-hot-100/滑动窗口

新增测试:在题目所在目录建 __test__/basic.test.ts 即可(include 已限定 src/**/*.{test,spec}.{ts,tsx})。

测试是逐步补上的 —— 早期题目只有实现与注释,覆盖率仍在提升。

📐 工程约定

项 约定
文件命名 <题号>. <题名>.ts;无题号的算法(排序专题)直接以算法名命名
导出方式 每题 export default 主函数
结构定义 题目专有的就近声明;跨题复用的放 src/data-structure/
代码风格 Prettier 统一:120 列 / 4 空格 / 双引号 / 分号,保存自动格式化
TS 配置 strict: true,但 strictNullChecks: false —— 刷题时少一些空值噪音

🗂 题库来源

题库 题量 二级分类
leetcode-hot-100 45 (根目录题目) 16 · 二叉树 2 · 前缀和 2 · 双指针 4 · 哈希 3 · 字符串 1 · 技巧 5 · 数组 2 · 栈 1 · 滑动窗口 3 · 矩阵 3 · 链表 3
剑指 Offer 56 (根目录题目) 15 · 位运算 3 · 分治算法 2 · 动态规划 5 · 双指针 7 · 字符串 4 · 排序 2 · 搜索与回溯算法 2 · 数学 3 · 查找算法 6 · 栈与队列 4 · 链表 3

📝 说明

  • 仓库持续更新:新题按分类归档;来自题库的题目会同时进两个维度
  • 除题解外,排序专题/ 收录了基础排序的手写实现(冒泡 / 选择 / 插入 / 希尔 / 归并 / 快速),堆排序、基数排序等仍在待办中
  • 如果你也在刷同一道题:欢迎参考,但先自己写一遍再看 —— 题解的价值在于思路,不在答案

About

学习 TypeScript 算法。使用 VSCode 刷 LeetCode,Vitest 单测,以及开箱即用的编辑器 debug 配置。

Topics

Resources

Stars

20 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages