codetop算法分类

以下是将你提供的算法题目列表还原成原始链接的格式:

1. 动态规划

2.

3. 广度优先搜索

4. 深度优先搜索

5. 回溯

6. 贪心

7. 双指针

8. 字符串

9. 哈希表

10. 数学

11.

12. 链表

13. 搜索

14. 排序

15. 位运算

16.

17. 设计

18. 模拟

19. 并查集

20.


当然可以!动态规划(DP)在不同类型的题目中应用广泛,通常根据问题的性质,可以进一步将动态规划问题归类为以下几种常见类型:

1. 线性 DP

这些问题的状态转移一般是基于一个或多个前面的状态,常见的有数组、字符串相关的题目。

53. 最大子数组和
62. 不同路径
63. 不同路径 II
70. 爬楼梯
198. 打家劫舍
213. 打家劫舍 II
221. 最大正方形
300. 最长上升子序列
309. 最佳买卖股票时机含冷冻期
376. 摆动序列
413. 等差数列划分
509. 斐波那契数
518. 零钱兑换 II
剑指 Offer 10- I. 斐波那契数列
剑指 Offer 10- II. 青蛙跳台阶问题
剑指 Offer 42. 连续子数组的最大和

2. 背包问题

背包问题的核心是如何选择一些物品,使得总价值最大或满足某个条件。经典的背包问题有0-1背包、完全背包、多重背包等。

416. 分割等和子集
518. 零钱兑换 II

3. 区间 DP

区间 DP 常用于需要考虑多个区间组合的优化问题,如字符串的编辑距离、矩阵连乘问题等。

516. 最长回文子序列
312. 戳气球

4. 子序列/子数组 DP

这类问题通常是求解数组或字符串中的某个子序列、子数组的最优解,如最长递增子序列、最长公共子序列等。

1143. 最长公共子序列
300. 最长上升子序列
392. 判断子序列
647. 回文子串
673. 最长递增子序列的个数

5. 树形 DP

树形 DP 通常应用于树结构的问题,解决方法是通过递归或自底向上地进行动态规划。

337. 打家劫舍 III
剑指 Offer 34. 二叉树中和为某一值的路径

6. 字符串 DP

字符串 DP 问题处理的是字符串的各种匹配、变换问题,如编辑距离、正则匹配等。

10. 正则表达式匹配
44. 通配符匹配
72. 编辑距离
97. 交错字符串
115. 不同的子序列
131. 分割回文串
139. 单词拆分
140. 单词拆分 II

7. 数位 DP

数位 DP 是一种特殊的动态规划问题,通常用于解决数字相关的问题,比如计算满足某些条件的数字个数。

233. 数字 1 的个数

8. 状态压缩 DP

状态压缩 DP 主要用于解决涉及多个条件或状态的组合问题,常见于图论中的最短路径问题或集合覆盖问题。

691. 贴纸拼词

9. 博弈 DP

博弈 DP 主要用于求解两个人(或多个人)在一个游戏中的最优策略问题。

464. 我能赢吗
877. 石子游戏

10. 矩阵 DP

矩阵 DP 通常用来解决二维表格或矩阵中的最优解问题,如最大正方形、路径问题等。

120. 三角形最小路径和
221. 最大正方形
64. 最小路径和

11. 记忆化搜索

记忆化搜索是一种将递归与动态规划结合的方法,通过保存中间结果来避免重复计算。

329. 矩阵中的最长递增路径

12. 其他 DP 问题

一些问题可能不完全归属于上述某一类,但依然可以使用动态规划的思想来解决。

887. 鸡蛋掉落

通过上述归类,你可以更好地理解不同类型的动态规划问题及其应用场景。随着练习的深入,你会逐渐掌握每种类型的解题思路,并在遇到新问题时迅速识别并应用合适的动态规划技巧。


1. 两数之和 [哈希表]
10. 正则表达式匹配 [动态规划, 回溯]
100. 相同的树 [树, 深度优先搜索, 广度优先搜索]
1004. 最大连续1的个数 III [滑动窗口]
101. 对称二叉树 [树, 深度优先搜索, 广度优先搜索]
102. 二叉树的层序遍历 [树, 广度优先搜索]
103. 二叉树的锯齿形层次遍历 [树, 广度优先搜索]
104. 二叉树的最大深度 [树, 深度优先搜索]
1044. 最长重复子串 [二分查找, 后缀数组, 字符串, 滑动窗口]
1047. 删除字符串中的所有相邻重复项 [栈]
105. 从前序与中序遍历序列构造二叉树 [树, 深度优先搜索]
106. 从中序与后序遍历序列构造二叉树 [树, 深度优先搜索]
108. 将有序数组转换为二叉搜索树 [树, 深度优先搜索, 二分查找]
1095. 山脉数组中查找目标值 [二分查找]
11. 盛最多水的容器 [双指针, 贪心]
110. 平衡二叉树 [树, 深度优先搜索]
111. 二叉树的最小深度 [树, 深度优先搜索, 广度优先搜索]
112. 路径总和 [树, 深度优先搜索]
113. 路径总和 II [树, 深度优先搜索]
114. 二叉树展开为链表 [树, 深度优先搜索]
1143. 最长公共子序列 [动态规划]
115. 不同的子序列 [动态规划]
12. 整数转罗马数字 [数学, 贪心]
120. 三角形最小路径和 [动态规划]
121. 买卖股票的最佳时机 [动态规划, 贪心]
122. 买卖股票的最佳时机 II [贪心]
123. 买卖股票的最佳时机 III [动态规划]
124. 二叉树中的最大路径和 [树, 深度优先搜索]
125. 验证回文串 [双指针, 字符串]
128. 最长连续序列 [哈希表, 并查集]
129. 求根到叶子节点数字之和 [树, 深度优先搜索]
13. 罗马数字转整数 [数学, 字符串]
130. 被围绕的区域 [深度优先搜索, 广度优先搜索, 并查集]
131. 分割回文串 [动态规划, 回溯]
134. 加油站 [贪心]
135. 分发糖果 [贪心]
136. 只出现一次的数字 [位运算]
138. 复制带随机指针的链表 [哈希表, 链表]
139. 单词拆分 [动态规划]
14. 最长公共前缀 [字符串]
141. 环形链表 [链表, 双指针]
142. 环形链表 II [链表, 双指针]
143. 重排链表 [链表, 双指针]
144. 二叉树的前序遍历 [树, 深度优先搜索]
1444. 切披萨的方案数 [动态规划]
145. 二叉树的后序遍历 [树, 深度优先搜索]
146. LRU缓存机制 [设计, 哈希表, 链表]
148. 排序链表 [排序, 链表, 归并排序]
15. 三数之和 [双指针, 排序]
151. 翻转字符串里的单词 [双指针, 字符串]
152. 乘积最大子数组 [动态规划]
153. 寻找旋转排序数组中的最小值 [二分查找]
154. 寻找旋转排序数组中的最小值 II [二分查找]
155. 最小栈 [栈, 设计]
16. 最接近的三数之和 [双指针, 排序]
160. 相交链表 [链表, 双指针]
162. 寻找峰值 [二分查找]
165. 比较版本号 [双指针, 字符串]
167. 两数之和 II - 输入有序数组 [双指针, 二分查找]
168. Excel表列名称 [数学]
169. 多数元素 [位运算, 数组, 分治, 计数]
17. 电话号码的字母组合 [回溯]
179. 最大数 [排序, 字符串]
18. 四数之和 [双指针, 排序]
188. 买卖股票的最佳时机 IV [动态规划]
189. 轮转数组 [双指针, 数组]
19. 删除链表的倒数第N个节点 [链表, 双指针]
191. 位1的个数 [位运算]
198. 打家劫舍 [动态规划]
199. 二叉树的右视图 [树, 深度优先搜索, 广度优先搜索]
2. 两数相加 [链表, 数学]
20. 有效的括号 [栈, 字符串]
200. 岛屿数量 [深度优先搜索, 广度优先搜索, 并查集]
206. 反转链表 [链表]
207. 课程表 [深度优先搜索, 广度优先搜索, 拓扑排序]
208. 实现 Trie (前缀树) [设计, 字典树]
209. 长度最小的子数组 [双指针, 二分查找]
21. 合并两个有序链表 [链表]
210. 课程表 II [深度优先搜索, 广度优先搜索, 拓扑排序]
213. 打家劫舍 II [动态规划]
214. 最短回文串 [字符串, KMP算法]
215. 数组中的第K个最大元素 [数组, 分治, 快速选择, 排序]
219. 存在重复元素 II [哈希表, 滑动窗口]
22. 括号生成 [回溯]
221. 最大正方形 [动态规划]
222. 完全二叉树的节点个数 [树, 二分查找]
224. 基本计算器 [栈, 递归, 数学]
225. 用队列实现栈 [栈, 设计, 队列]
226. 翻转二叉树 [树, 深度优先搜索, 广度优先搜索]
227. 基本计算器 II [栈, 数学, 字符串]
23. 合并K个排序链表 [链表, 分治, 堆(优先队列)]
230. 二叉搜索树中第K小的元素 [树, 深度优先搜索, 二分查找]
232. 用栈实现队列 [栈, 设计, 队列]
234. 回文链表 [栈, 递归, 链表, 双指针]
236. 二叉树的最近公共祖先 [树, 深度优先搜索]
238. 除自身以外数组的乘积 [数组, 前缀和]
239. 滑动窗口最大值 [队列, 滑动窗口, 单调队列, 堆]
24. 两两交换链表中的节点 [递归, 链表]
240. 搜索二维矩阵 II [二分查找, 分治]
242. 有效的字母异位词 [哈希表, 字符串, 排序]
25. K 个一组翻转链表 [链表]
253. 会议室 II [贪心, 数组, 双指针, 排序, 堆]
256. 粉刷房子 [动态规划]
257. 二叉树的所有路径 [深度优先搜索, 树, 字符串, 回溯]
258. 各位相加 [数学, 数学归纳法]
26. 删除排序数组中的重复项 [双指针, 数组]
260. 只出现一次的数字 III [位运算]
264. 丑数 II [堆, 数学, 动态规划]
268. 缺失数字 [位运算, 数组, 数学]
279. 完全平方数 [广度优先搜索, 数学, 动态规划]
283. 移动零 [双指针, 数组]
287. 寻找重复数 [位运算, 双指针, 数组, 二分查找]
295. 数据流的中位数 [设计, 双指针, 数据流, 排序, 堆]
297. 二叉树的序列化与反序列化 [设计, 树, 深度优先搜索, 广度优先搜索]
3. 无重复字符的最长子串 [哈希表, 字符串, 滑动窗口]
300. 最长上升子序列 [动态规划, 二分查找]
31. 下一个排列 [双指针, 字符串]
316. 去除重复字母 [栈, 贪心, 字符串, 单调栈]
32. 最长有效括号 [栈, 字符串, 动态规划]
322. 零钱兑换 [广度优先搜索, 动态规划]
328. 奇偶链表 [链表, 双指针]
329. 矩阵中的最长递增路径 [深度优先搜索, 动态规划, 图, 拓扑排序, 记忆化]
33. 搜索旋转排序数组 [数组, 二分查找]
337. 打家劫舍 III [树, 深度优先搜索, 动态规划]
34. 在排序数组中查找元素的第一个和最后一个位置 [数组, 二分查找]
343. 整数拆分 [数学, 动态规划]
344. 反转字符串 [双指针, 字符串]
347. 前 K 个高频元素 [数组, 哈希表, 分治, 快速选择, 排序, 堆]
349. 两个数组的交集 [数组, 哈希表, 双指针, 二分查找, 排序]
35. 搜索插入位置 [数组, 二分查找]
353. 蛇梯棋 [广度优先搜索, 图, 数组, 矩阵]
36. 有效的数独 [数组, 哈希表, 矩阵]
37. 解数独 [回溯]
378. 有序矩阵中第K小的元素 [二分查找, 矩阵, 堆]
38. 报数 [字符串]
380. 常数时间插入、删除和获取随机元素 [设计, 数组, 哈希表]
384. 打乱数组 [数组, 数学, 随机化]
39. 组合总和 [数组, 回溯]
394. 字符串解码 [栈, 字符串, 递归]
395. 至少有K个重复字符的最长子串 [递归, 分治, 滑动窗口]
4. 寻找两个正序数组的中位数 [数组, 二分查找, 分治]
40. 组合总和 II [数组, 回溯]
400. 第N个数字 [数学, 二分查找]
402. 移掉K位数字 [栈, 贪心, 字符串, 单调栈]
41. 缺失的第一个正数 [数组, 哈希表]
410. 分割数组的最大值 [数组, 二分查找, 动态规划, 前缀和]
415. 字符串相加 [数学, 字符串, 模拟]
416. 分割等和子集 [数组, 动态规划]
42. 接雨水 [栈, 数组, 双指针, 动态规划, 单调栈]
426. 将二叉搜索树转化为排序的双向链表 [树, 深度优先搜索, 链表, 双向链表]
43. 字符串相乘 [数学, 字符串, 模拟]
44. 通配符匹配 [贪心, 递归, 字符串, 动态规划]
440. 字典序的第K小数字 [深度优先搜索, 字典树]
442. 数组中重复的数据 [数组, 哈希表]
443. 压缩字符串 [双指针, 字符串]
445. 两数相加 II [栈, 链表, 数学]
45. 跳跃游戏 II [贪心, 数组, 动态规划]
450. 删除二叉搜索树中的节点 [树, 二分查找, 二叉搜索树]
459. 重复的子字符串 [字符串, 字符串匹配]
46. 全排列 [回溯]
460. LFU缓存 [设计, 哈希表, 链表, 双向链表]
468. 验证IP地址 [字符串]
47. 全排列 II [数组, 回溯]
470. 用 Rand7() 实现 Rand10() [数学, 随机化, 拒绝采样]
48. 旋转图像 [数组, 数学, 矩阵]
49. 字母异位词分组 [数组, 哈希表, 字符串, 排序]
494. 目标和 [数组, 动态规划, 回溯]
498. 对角线遍历 [数组, 矩阵, 模拟]
5. 最长回文子串 [字符串, 动态规划, 中心扩展]
50. Pow(x, n) [数学, 递归]
503. 下一个更大元素 II [栈, 数组, 单调栈]
509. 斐波那契数 [数学, 动态规划]
51. N皇后 [回溯]
516. 最长回文子序列 [字符串, 动态规划]
518. 零钱兑换 II [数组, 动态规划]
52. N皇后 II [回溯]
53. 最大子数组和 [数组, 动态规划, 分治]
54. 螺旋矩阵 [数组, 矩阵, 模拟]
543. 二叉树的直径 [树, 深度优先搜索]
55. 跳跃游戏 [贪心, 数组, 动态规划]
554. 砖墙 [哈希表]
556. 下一个更大元素 III [栈, 数学, 字符串]
557. 反转字符串中的单词 III [双指针, 字符串]
56. 合并区间 [数组, 排序]
560. 和为K的子数组 [数组, 哈希表, 前缀和]
567. 字符串的排列 [哈希表, 双指针, 字符串, 滑动窗口]
572. 另一个树的子树 [树, 深度优先搜索, 字符串匹配, 哈希函数]
59. 螺旋矩阵 II [数组, 矩阵, 模拟]
6. Z 字形变换 [字符串, 模拟]
61. 旋转链表 [链表, 双指针]
611. 有效三角形的个数 [数组, 双指针, 排序, 二分查找]
62. 不同路径 [数组, 动态规划, 组合数学]
621. 设计循环队列 [设计, 队列, 数组, 链表]
63. 不同路径 II [数组, 动态规划]
64. 最小路径和 [数组, 动态规划]
647. 回文子串 [字符串, 动态规划, 中心扩展]
662. 二叉树最大宽度 [树, 深度优先搜索, 广度优先搜索]
670. 最大交换 [贪心, 数组]
673. 最长递增子序列的个数 [数组, 动态规划, 二分查找]
678. 有效的括号字符串 [栈, 贪心, 字符串, 动态规划]
679. 24 点游戏 [数组, 数学, 回溯]
69. x 的平方根 [数学, 二分查找]
695. 岛屿的最大面积 [深度优先搜索, 广度优先搜索, 并查集, 数组, 矩阵]
7. 整数反转 [数学]
70. 爬楼梯 [动态规划, 递归, 记忆化]
704. 二分查找 [数组, 二分查找]
71. 简化路径 [栈, 字符串]
718. 最长重复子数组 [数组, 二分查找, 动态规划, 滑动窗口, 哈希函数]
72. 编辑距离 [字符串, 动态规划]
73. 矩阵置零 [数组, 哈希表, 矩阵]
739. 每日温度 [栈, 数组, 单调栈]
74. 搜索二维矩阵 [数组, 二分查找, 矩阵]
75. 颜色分类 [数组, 双指针, 排序]
76. 最小覆盖子串 [哈希表, 字符串, 滑动窗口]
763. 划分字母区间 [贪心, 哈希表, 双指针, 字符串]
766. 托普利茨矩阵 [数组, 矩阵]
77. 组合 [回溯]
78. 子集 [位运算, 数组, 回溯]
79. 单词搜索 [深度优先搜索, 回溯, 数组, 矩阵]
8. 字符串转换整数 (atoi) [字符串]
81. 搜索旋转排序数组 II [数组, 二分查找]
82. 删除排序链表中的重复元素 II [链表, 双指针]
83. 删除排序链表中的重复元素 [链表]
84. 柱状图中最大的矩形 [栈, 数组, 单调栈]
85. 最大矩形 [栈, 数组, 动态规划, 矩阵, 单调栈]
86. 分隔链表 [链表, 双指针]
863. 二叉树中所有距离为 K 的结点 [树, 深度优先搜索, 广度优先搜索]
876. 链表的中间结点 [链表, 双指针]
88. 合并两个有序数组 [数组, 双指针, 排序]
887. 鸡蛋掉落 [动态规划, 数学, 二分查找]
9. 回文数 [数学]
90. 子集 II [位运算, 数组, 回溯]
91. 解码方法 [字符串, 动态规划]
92. 反转链表 II [链表]
93. 复原IP地址 [字符串, 回溯]
94. 二叉树的中序遍历 [树, 深度优先搜索]
95. 不同的二叉搜索树 II [树, 动态规划, 回溯]
958. 二叉树的完全性检验 [树, 广度优先搜索, 数组]
96. 不同的二叉搜索树 [树, 动态规划, 数学]
97. 交错字符串 [字符串, 动态规划]
98. 验证二叉搜索树 [树, 深度优先搜索, 二分查找]
剑指 Offer 03. 数组中重复的数字 [哈希表, 排序, 二分查找]
剑指 Offer 04. 二维数组中的查找 [数组, 二分查找, 分治, 矩阵]
剑指 Offer 09. 用两个栈实现队列 [栈, 设计, 队列]
剑指 Offer 10- I. 斐波那契数列 [动态规划, 递归, 记忆化]
剑指 Offer 10- II. 青蛙跳台阶问题 [动态规划, 递归, 记忆化]
剑指 Offer 11. 旋转数组的最小数字 [数组, 二分查找]
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 [数组, 双指针, 排序]
剑指 Offer 22. 链表中倒数第k个节点 [链表, 双指针]
剑指 Offer 26. 树的子结构 [树, 深度优先搜索]
剑指 Offer 27. 二叉树的镜像 [树, 深度优先搜索, 广度优先搜索]
剑指 Offer 29. 顺时针打印矩阵 [数组, 矩阵, 模拟]
剑指 Offer 33. 二叉搜索树的后序遍历序列 [栈, 树, 二叉搜索树, 递归, 单调栈]
剑指 Offer 34. 二叉树中和为某一值的路径 [树, 深度优先搜索, 回溯]
剑指 Offer 36. 二叉搜索树与双向链表 [树, 深度优先搜索, 链表, 双向链表]
剑指 Offer 39. 数组中出现次数超过一半的数字 [数学, 位运算, 数组, 分治]
剑指 Offer 40. 最小的k个数 [数组, 分治, 快速选择, 排序, 堆]
剑指 Offer 42. 连续子数组的最大和 [数组, 动态规划, 分治]
剑指 Offer 45. 把数组排成最小的数 [贪心, 排序, 字符串]
剑指 Offer 48. 最长不含重复字符的子字符串 [哈希表, 字符串, 滑动窗口]
剑指 Offer 51. 数组中的逆序对 [树状数组, 线段树, 数组, 归并排序, 二分查找]
剑指 Offer 52. 两个链表的第一个公共节点 [链表, 双指针]
剑指 Offer 53 - I. 在排序数组中查找数字 I [数组, 二分查找]
剑指 Offer 54. 二叉搜索树的第k大节点 [树, 深度优先搜索, 二分查找]
剑指 Offer 61. 扑克牌中的顺子 [数组, 排序, 哈希表]
剑指 Offer 62. 圆圈中最后剩下的数字 [数学, 递归]
补充题1. 排序奇升偶降链表 [链表, 排序]
补充题14. 阿拉伯数字转中文数字 [字符串, 模拟]
补充题2. 圆环回原点问题 [动态规划, 数学]
补充题23. 检测循环依赖 [图, 拓扑排序, 深度优先搜索]
补充题4. 手撕快速排序 [排序, 分治, 快速选择]
补充题5. 手撕归并排序 [排序, 分治, 归并排序]
补充题6. 手撕堆排序 [排序, 堆]
补充题9. 36进制加法 [字符串, 模拟]
面试题 02.05. 链表求和 [链表, 数学]
面试题 17.24. 最大子矩阵 [数组, 动态规划, 前缀和]
posted @   calvincalvin  阅读(18)  评论(24编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示