算法题分类
总览
- 看到矩阵首先想到 状态压缩
- 任何题目都先思考 枚举
- 最大最小 或 最小最大 考虑二分,二值性、单调性也可考虑 二分
- 看到 枚举为何/二选一 状态时,可以考虑 动态规划,然后才更进一步地考虑贪心
- 看到 覆盖问题,可以考虑 DLX 的思想,覆盖问题其实也是搜索问题,而搜索算法,本质上,就是枚举 + 递归
- 区间同加减相同的 数 则为差分,同加减 等差数列 则 差分的差分,本质是将数组看成 函数曲线
- 看到相同、比较、数据元素集中,可以考虑哈希
- 依据自动机理论,优先查看终止状态的特征
数据结构
概要:
- 物理本质:顺序结构、链式结构
- 基础逻辑:集合结构(没有关系,索引和元素一对一)、线性结构(一对一)、树状结构(一对多)、图形结构(多对多)
- 基本构造逻辑:确定问题本质 + 选择基础逻辑结构 + 选择基础数据结构 + 设计操作方式
- 问题特征:普通的枚举或其他算法无法降低复杂度时,需要利用空间来换取时间
一般结构构造
- 981. 基于时间的键值存储
- 466. 统计重复个数(2024-01-02):循环节
- 1743. 从相邻元素对还原数组:从相同中找不同
- 1286. 字母组合迭代器:迭代器
- 2424. 最长上传前缀:最长上传前缀
- 2296. 设计一个文本编辑器
栈/队列
哈希表
- 1. 两数之和
- 447. 回旋镖的数量
- 1001. 网格照明:利用直线方程作为哈希标准
- 1392. 最长快乐前缀
差分/前缀和
- 1109. 航班预订统计:非常典型地运用了差分的性质
- 2536. 子矩阵元素加 1:典型的二维差分
- 1878. 矩阵中最大的三个菱形和:分段前缀和
- 1124. 表现良好的最长时间段
位操作
概要:
- 物理本质:计算机的基本单位为 0-1 比特
- 基础逻辑:
、补码、浮点数 - 位操作与集合:从集合论到位运算,常见位运算技巧分类总结!
- 可以用于状态压缩,譬如 小写字母哈希表
问题:
- 2397. 被列覆盖的最多行数(2024-01-04)
- 2044. 统计按位或能得到最大值的子集数目
- 2411. 按位或最大的最小子数组长度:存在连续的同值区间
- 2859. 计算 K 置位下标对应元素的和
- 1255. 得分最高的单词集合:状态压缩,可以与 0-1 背包一样思考下
参考:
- lowbit:
x & -x
- Gosper's Hack:
lb = t & -t; r = t + lb;t = (((r ^ t) >> 2) // lb) | r
递归
问题:
- 依据操作递归:
分治(二分)算法
概要:
- 本质:递归
- 基础:分割 + 解决 + 合并
- 问题特征:规模缩小易解决 + 可分解为相同抽象问题 + 子解可合并为整解 + 子问题相互独立
- 注意代码:若左闭右闭区间,则需要记录满足条件的 ans = mid,返回 ans ;若左闭右开,则不需要,此时 l === r,随便返回谁
题目:
参考:
动态规划
概要:
- 本质:递归
- 基础:最优子结构
- 整体把握:位置 + 状态(属性)
题目:
- 1349. 参加考试的最大学生数
- 1823. 找出游戏的获胜者
- 931. 下降路径最小和
- 877. 石子游戏:博弈中的规划,自底向上的思想
- 1218. 最长定差子序列
- 1048. 最长字符串链
- 2320. 统计放置房子的方式数
- 1524. 和为奇数的子数组数目
- 1277. 统计全为 1 的正方形子矩阵:二维dp
- 2809. 使数组和小于等于 x 的最少时间
- 1248. 统计「优美子数组」
- 2212. 射箭比赛中的最大得分:如何记录经过的路径
- 2054. 两个最好的不重叠活动:基于时序,记录过去最好的,并将其看作过去
- 1326. 灌溉花园的最少水龙头数目:区间dp
- 2305. 公平分发饼干:状压 dp
- 514. 自由之路
- 2327. 知道秘密的人数:时序
参考:
贪心算法
概要:
- 本质:递归
- 基础:最优子结构 + 贪心选择性
- 整体把握:位置 + 结构特征 + 状态(属性)
题目:
参考:
搜索算法
概要:
- 本质:递归 + 枚举
- 基础:前序遍历、中序遍历、后序遍历
- 整体把握:函数参数 + 终止条件 + 返回值 + 递归返回值 与 对返回值的操作 的顺序
题目:
- 1325. 删除给定值的叶子节点(2024-01-03):DFS + 后序遍历
- 365. 水壶问题
基础遍历:
- 1008. 前序遍历构造二叉搜索树
- 105. 从前序与中序遍历序列构造二叉树
- 2476. 二叉搜索树最近节点查询
- 1123. 最深叶节点的最近公共祖先:该题解提供许多相同类型题
- 236. 二叉树的最近公共祖先:可参考算法详解之最近公共祖先(LCA)
- 2846. 边权重均等查询:解此题时应该可以想到 tarjan 的思路
- 2049. 统计最高分的节点数目
- 1373. 二叉搜索子树的最大键值和:后序遍历,以及其返回值和参数
- 39. 组合总和:树上剪枝
字典树/字符串
字符串 s 与它的逆序 rs 的 LCS 就是 s 的最长回文子序列(反证法)
并查集/图
拓扑排序
参考:
数学
博弈
数论
- 1015. 可被 K 整除的最小整数
- 858. 镜面反射
- 365. 水壶问题
- 878. 第 N 个神奇数字:不要太执着于函数映射,适当使用迭代法
具体算法
- KMP算法:28. 找出字符串中第一个匹配项的下标
依题干分类
前后缀问题
矩阵
滑动窗口
不定长滑动窗口(求最长/最大)
3. 无重复字符的最长子串
1493. 删掉一个元素以后全为 1 的最长子数组 1423
904. 水果成篮 1516
1695. 删除子数组的最大得分 1529
2841. 几乎唯一子数组的最大和 1546
2024. 考试的最大困扰度 1643
1004. 最大连续1的个数 III 1656
1438. 绝对差不超过限制的最长连续子数组 1672
2401. 最长优雅子数组 1750
1658. 将 x 减到 0 的最小操作数 1817
1838. 最高频元素的频数 1876
2831. 找出最长等值子数组 1976
2106. 摘水果 2062
1610. 可见点的最大数目 2147
159. 至多包含两个不同字符的最长子串(会员题)
340. 至多包含 K 个不同字符的最长子串(会员题)
不定长滑动窗口(求最短/最小)
209. 长度最小的子数组
1234. 替换子串得到平衡字符串 1878
1574. 删除最短的子数组使剩余数组有序 1932
76. 最小覆盖子串
不定长滑动窗口(求子数组个数)
2799. 统计完全子数组的数目 1398
713. 乘积小于 K 的子数组
1358. 包含所有三种字符的子字符串数目 1646
2302. 统计得分小于 K 的子数组数目 1808
2537. 统计好子数组的数目 1892
2762. 不间断子数组 1940
多指针滑动窗口
930. 和相同的二元子数组 1592
1248. 统计「优美子数组」 1624
1712. 将数组分成三个子数组的方案数 2079
2444. 统计定界子数组的数目 2093
992. K 个不同整数的子数组 2210
区间相关
其他好题
- 2735. 收集巧克力
- 1813. 句子相似性 III
- 1247. 交换字符使得字符串相同:自底向上,整体把握
- 2364. 统计坏数对的数目:公式转换
- 2447. 最大公因数等于 K 的子数组数目:利用dp 与 去重的思想
类似的题目
枚举为 或
由于要获得满足某一确定条件的结果,而不确定该往哪条路走
- 2305. 公平分发饼干:个数确定,状态确定 。0 - 1背包,使用状态压缩位运算来记录状态与转移状态
- 2064. 分配给商店的最多商品的最小值:依据个数二分
- 2594. 修车的最少时间:一样二分地搜索
- 991. 坏了的计算器:状态确定,个数不确定,根据状态转移函数以及状态的性质
- 2585. 获得分数的方法数:取值确定 背包问题,但是组合结果是一个范围,寻求组合数,状态可以取也可以不取
- 873. 最长的斐波那契子序列的长度:利用数列公式进行状态转移
- 2386. 找出数组的第 K 大和:画成树
一些代码的细节 、 锻炼代码能力 、 代码优化
-
在写循环时,需要遵循 代码不变量原则
-
要在意复杂度中的 常数 以及 被略去的较小复杂度
低级错误:
- 2008. 出租车的最大盈利:dp 中,若有当前值与某循环值比较的话,注意 当前 dp 是否需要先赋值
- 2765. 最长交替子数组:在循环中,一定要使用循环中的临时变量(t = cur - pre),而不能直接利用全程变量(ans = max(t, ans))来代替临时变量
代码优化:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库