关键字匹配高效算法
前言:当问题里面出现了以下的关键字,就可以快速联想到对应高效算法
类别一:基础优化与思维
| 算法/数据结构 | 关键字 / 问题模式 | |
| 排序 (Sort) | 配对, 区间, 相邻元素, 第k大/小, 去重, 相对顺序 | |
| 贪心 (Greedy) | 区间调度, 哈夫曼树, 最小生成树, 部分背包, 不相交 | |
| 二分查找 | 最大化最小值, 最小化最大值, 求满足条件的最小/最大值 | |
| 双指针 (Two Pointers) | 滑动窗口, 连续子段/子数组, 和为定值, 字符串匹配 | |
| 位运算 (Bit Manipulation) | 状态压缩, 集合操作, 权限判断, 求子集, 奇偶性, N<=20 | |
| 前缀和/差分 | 区间和查询, 子数组和, 二维区域和, 对区间进行统一加减 | |
| 模拟 (Simulation) | 规则繁多,按题意操作, 日期计算, 棋盘问题 |
类别二:编程技巧与基础模式
| 技巧/模式 | 关键字 / 问题模式 | |
| 嵌套循环(for套for) | 二维数组/矩阵, 网格(Grid), 棋盘, 坐标(x, y), 枚举点对 | |
| 递归 (Recursion) | 树的遍历, 分治, DFS, 排列组合生成, 斐波那契 | |
| 分治 | 归并排序, 快速排序, 快速幂, 最近点对 | |
| 回溯 (Backtracking) | 所有方案, 组合, 排列, 子集, N皇后, 数独 | |
| 记忆化搜索 | 递归+缓存, 避免重复计算, 自顶向下DP | |
| 离散化 | 坐标范围大但数量不多, 只关心相对大小 | |
| 随机化算法 | 求近似解, 时限非常紧, 没有确定性多项式解法 |
类别三:数据结构
| 算法/数据结构 | 关键字 / 问题模式 | |
| 栈 (Stack) | 括号匹配, 表达式求值, 单调栈 (找左右第一个比它大/小的数) | |
| 队列 (Queue) | 层序遍历 (BFS), 先进先出, 排队问题 | |
| 堆 (Priority Queue) | 第k大/小(动态), 维护中位数, 合并果子, Dijkstra优化 | |
| 哈希表 | 快速查找, 计数, 去重, 映射关系, 两数之和 | |
| 并查集 | 连通性, 动态分组, 合并集合, 判断是否在同一集合 | |
| 树状数组/线段树 | 单点修改+区间查询, 区间修改+区间查询, 动态区间问题 | |
| 字典树 (Trie) | 前缀查询, 字符串查找, 异或最大值 |
类别四:动态规划 (DP)
| DP模型 | 关键字 / 问题模式 | |
| 线性DP | 最长上升子序列, 最大子段和, 爬楼梯, 打家劫舍 | |
| 背包DP | N个物品, 容量为V, 选或不选, 装满 | |
| 区间DP | 合并石子, 括号匹配方案数, 回文串 | |
| 树形DP | 在树上进行选择, 树的直径, 没有上司的舞会 | |
| 状态压缩DP | N很小(通常N<=20), 棋盘, 集合, 哈密顿路径 | |
| 数位DP | 求[L, R]区间内满足条件的数的个数 |
类别五:图论与搜索
| 算法/数据结构 | 关键字 / 问题模式 | |
| BFS | 最少步数/操作 (边权为1), 迷宫最短路, 层序遍历 | |
| DFS | 所有方案, 连通块数量, 找环, 拓扑排序, 暴力搜索 | |
| 最短路径 | 最短路径 (边权非1), 最小花费, Dijkstra, SPFA | |
| 最小生成树 (MST) | 连接所有点, 最小总代价, 修建公路, Kruskal | |
| 拓扑排序 | 课程安排, 依赖关系, 任务顺序, 有向无环图(DAG) | |
| 强连通/双连通 | 有向图, 任意两点可达, 缩点, 桥, 割点 |
类别六:字符串算法
| 算法/数据结构 | 关键字 / 问题模式 | |
| 字符串哈希 | 字符串匹配, 判断子串是否相等 | |
| KMP算法 | 单模式串匹配, 循环节, 前缀与后缀 | |
| AC自动机 | 多模式串匹配, 敏感词过滤 | |
| Manacher算法 | 最长回文子串 | |
| 后缀数组/自动机 | 子串相关问题, 不同子串个数, 字典序第k大 |
类别七:数学 |
| 领域 | 关键字 / 问题模式 | |
| 数论 | 质数, GCD, 模运算, 逆元, 同余 | |
| 组合数学 | 排列组合, 方案数, 卡特兰数, 容斥原理 | |
| 博弈论 | 取石子游戏, 轮流操作, 必胜/必败 | |
| 计算几何 | 点/线/面, 凸包, 旋转卡壳, 最近点对 |
类别八:高级思维与技巧
| 技巧/模式 | 关键字 / 问题模式 | |
| 构造题 | 构造一个满足...的方案, 是否存在..., 给出一种解 | |
| 交互题 | 交互, 查询次数限制 | |
| 贡献法 | 求所有子区间的...总和, 期望 | |
| 根号分治 | 两种暴力, 查询/修改次数不均衡, 阈值 | |
| CDQ分治 | 高维偏序, 动态逆序对, 带修改的区间第k大 | |
| 启发式合并 | 子树查询, 颜色统计, 离线 |
