蓝桥杯大纲知识点详解
蓝桥杯大纲知识点详解
大学C组
1. 枚举[1-3]
模板
1 | // 枚举模板 |
解题思路
- 遍历所有可能的情况
- 适用于数据规模较小的问题
题目特征
- 数据范围小(n ≤ 20)
- 需要穷举所有可能性
时间复杂度
- O(n) 或 O(n^k)
例题
1 | static void solve() { |
- LeetCode 78 - 子集
枚举所有子集
1 | class Solution { |
二进制枚举
1 | class Solution { |
1 | static void solve() { |
2. 排序
(1) 冒泡排序[2]
1 | // 冒泡排序模板 |
解题思路
- 相邻元素两两比较
- 每一轮将最大的元素冒泡到最后
题目特征
- 需要稳定排序
- 数据规模小(n ≤ 1000)
时间复杂度
- O(n^2)
例题
1 | import java.util.*; |
(2) 选择排序[3]
1 | // 选择排序模板 |
解题思路
- 每次找到未排序部分的最小元素
- 将其放到已排序部分的末尾
题目特征
- 需要不稳定排序
- 数据规模小(n ≤ 1000)
时间复杂度
- O(n^2)
(3) 插入排序[3]
1 | // 插入排序模板 |
解题思路
- 将元素插入到已排序部分的适当位置
- 适用于部分有序的数据
题目特征
- 需要稳定排序
- 数据规模小(n ≤ 1000)
时间复杂度
- O(n^2)
3. 搜索(bfs, dfs)[1-5]
1 | // BFS模板 |
解题思路
- 使用队列实现
- 按层次遍历图或树
- 适合寻找最短路径问题
题目特征
- 需要寻找最短路径或最少步骤
- 图或树的遍历问题
时间复杂度
- O(V+E) (V是顶点数,E是边数)
例题
(2) DFS模板
1 | // DFS模板 |
解题思路
- 使用递归或栈实现
- 深度优先遍历图或树
- 适合寻找所有可能解的问题
题目特征
- 需要遍历所有可能路径
- 排列组合问题
- 回溯问题
时间复杂度
- O(V+E) (V是顶点数,E是边数)
4. 贪心[1-5]
1 | // 贪心算法模板 |
解题思路
- 每一步选择当前最优解
- 不回溯,不重新考虑之前的选择
- 需要证明贪心选择的正确性
题目特征
- 问题具有最优子结构
- 贪心选择能得到全局最优解
- 常见于区间调度、背包问题等
时间复杂度
- 通常为O(n)或O(nlogn)
例题
5. 模拟[1-3]
1 | // 模拟算法模板 |
解题思路
- 严格按照题目描述实现
- 逐步模拟题目描述的过程
- 注意边界条件和特殊情况
题目特征
- 题目描述详细且步骤明确
- 需要精确实现特定规则
- 常见于游戏规则模拟、物理过程模拟等
时间复杂度
- 通常为O(n)或O(n^2)
例题
6. 二分[2-5]
1 | // 二分查找模板 |
解题思路
- 适用于有序数组的查找
- 每次将搜索范围缩小一半
- 注意边界条件的处理
题目特征
- 数据已排序或可以排序
- 需要高效查找(优于O(n))
- 常见于查找特定值或满足条件的极值
时间复杂度
- O(logn)
例题
7. DP(普通一维问题)[3-5]
1 | // 一维DP模板 |
解题思路
- 定义状态dp[i]表示问题在i处的解
- 找出状态转移方程
- 初始化边界条件
- 按顺序计算dp数组
题目特征
- 问题可以分解为子问题
- 子问题之间有重叠
- 有最优子结构性质
时间复杂度
- 通常为O(n)
例题
8. 高精度[1-5]
1 | // 高精度加法模板 |
解题思路
- 使用字符串或数组表示大数
- 模拟手工计算过程
- 注意进位处理
题目特征
- 数字超出基本数据类型范围
- 需要精确计算
- 常见于大数加减乘除运算
时间复杂度
- O(n) 其中n为数字的位数
例题
9. 数据结构
1 | // 栈模板 |
解题思路
- 后进先出(LIFO)的数据结构
- 适用于需要回溯的场景
- 常用于括号匹配、表达式求值等问题
题目特征
- 需要记录访问顺序
- 需要撤销操作
- 需要匹配对称结构
时间复杂度
- 基本操作均为O(1)
例题
(2) 队列[2-5]
1 | // 队列模板 |
解题思路
- 先进先出(FIFO)的数据结构
- 适用于需要按顺序处理的场景
- 常用于BFS、滑动窗口等问题
题目特征
- 需要按顺序处理元素
- 需要维护一个处理序列
- 需要广度优先遍历
时间复杂度
- 基本操作均为O(1)
(3) 链表 [2-5]
1 | // 链表节点定义 |
解题思路
- 动态数据结构,节点通过指针连接
- 适用于频繁插入删除的场景
- 常用于实现其他数据结构
题目特征
- 需要频繁插入删除操作
- 数据规模动态变化
- 需要灵活的内存分配
时间复杂度
- 遍历为O(n)
- 插入删除为O(1)(已知位置)
10. 数学
1 | // 判断质数模板 |
解题思路
- 质数判断: 试除法
- 最大公约数: 欧几里得算法
- 最小公倍数: 基于最大公约数计算
- 适用于数论相关题目
题目特征
- 涉及质数、因数、倍数等问题
- 需要计算公约数或公倍数
- 常见于数学计算类题目
时间复杂度
- 质数判断: O(√n)
- 最大公约数: O(log(min(a,b)))
例题
大学B组
11. 排序算法
(1)归并排序[4-5]
1 | // Java实现模板 |
解题思路:
- 分治思想,先递归分解数组,再合并有序子序列
- 典型题目:逆序对问题、外部排序
- 时间复杂度:O(nlogn)
(2)快速排序[4-5]
1 | // Java实现模板 |
解题思路:
- 选取基准值,将数组分为两部分
- 典型题目:TopK问题、中位数问题
- 时间复杂度:平均O(nlogn),最坏O(n²)
(3)桶排序[4]
1 | // Java实现模板 |
解题思路:
- 将数据分到有限数量的桶里
- 典型题目:数据范围已知且分布均匀的情况
- 时间复杂度:O(n+k)
(4)堆排序[4]
1 | // Java实现模板 |
解题思路:
- 利用堆这种数据结构设计的排序算法
- 典型题目:优先级队列、实时求TopK
- 时间复杂度:O(nlogn)
(5)基数排序[4~5]
1 | // Java实现模板 |
解题思路:
- 按照低位先排序,然后收集;再按高位排序
- 典型题目:多关键字排序(如日期、电话号码)
- 时间复杂度:O(n*k)
12. 搜索算法
(1)剪枝[4-6]
解题思路:
- 在搜索过程中提前排除不可能的分支
- 典型题目:数独、八皇后问题
(2)双向BFS[5-6]
解题思路:
- 从起点和终点同时开始BFS
- 典型题目:单词接龙、迷宫最短路径
(3)记忆化搜索[5]
1 | // Java实现模板 |
解题思路:
- 存储中间结果避免重复计算
- 典型题目:斐波那契数列、爬楼梯问题
(4)迭代加深搜索[5-6]
解题思路:
- 结合DFS和BFS,逐步增加深度限制
- 典型题目:IDA*算法、拼图问题
(5)启发式搜索[7]
解题思路:
- 使用估价函数指导搜索方向
- 典型题目:A*算法、八数码问题
13. 动态规划
(1)背包DP[4-6]
1 | // 01背包模板 |
解题思路:
- 状态转移方程:dp[i][j] = max(dp[i-1][j], dp[i-1][j-w]+v)
- 典型题目:01背包、完全背包、多重背包
(2)树形DP[4-6]
解题思路:
- 在树结构上进行动态规划
- 典型题目:二叉树中的最大路径和、树的最小支配集
(3)状压DP[5-6]
解题思路:
- 使用位运算表示状态
- 典型题目:旅行商问题、棋盘覆盖问题
(4)数位DP[5-6]
解题思路:
- 处理数字位上的计数问题
- 典型题目:统计区间内满足条件的数字个数
(5)DP的常见优化[7]
优化方法:
- 斜率优化
- 四边形不等式优化
- 单调队列优化
14. 字符串算法
(1)哈希[4-5]
1 | // 字符串哈希模板 |
解题思路:
- 将字符串映射为唯一数值
- 典型题目:字符串匹配、重复子串检测
(2)KMP[4-6]
1 | // KMP算法模板 |
解题思路:
- 利用部分匹配信息跳过不必要比较
- 典型题目:字符串匹配、循环节问题
(3)Manacher[4-6]
1 | // Manacher算法模板 |
解题思路:
- 线性时间求最长回文子串
- 典型题目:最长回文子串、回文分割
15. 图论算法
(1)欧拉回路[5-7]
解题思路:
- 图中存在经过每条边恰好一次的回路
- 典型题目:一笔画问题、邮路问题
(2)最小生成树[5-7]
1 | // Kruskal算法模板 |
解题思路:
- 连接所有顶点的最小权值子图
- 典型题目:城市道路建设、网络布线
(3)单源最短路及差分约束系统[5-7]
1 | // Dijkstra算法模板 |
解题思路:
- 求从一个点到其他所有点的最短路径
- 典型题目:路由选择、差分约束系统
(4)拓扑序列[5-7]
解题思路:
- 有向无环图的线性排序
- 典型题目:课程安排、任务调度
(5)二分图匹配[7]
1 | // 匈牙利算法模板 |
解题思路:
- 求二分图的最大匹配
- 典型题目:任务分配、婚姻匹配问题
(6)图的连通性问题[7]
解题思路:
- 割点、桥、强连通分量
- 典型题目:关键节点检测、网络脆弱性分析
(7)DFS序[5-7]
解题思路:
- 对树进行深度优先遍历得到的顺序
- 典型题目:子树查询、树链剖分
(8)最近共同祖先[5-7]
1 | // LCA模板 |
解题思路:
- 求树中两个节点的最近公共祖先
- 典型题目:家族关系查询、树路径问题
16. 数学
(1) 排列组合[5-6]
1 | // 排列数模板 |
解题思路
- 排列: 考虑顺序的选择
- 组合: 不考虑顺序的选择
- 递推法和动态规划预处理
题目特征
- 需要计算选择方式数量
- 涉及概率或统计问题
- 常见于计数类题目
时间复杂度
- 递推法: O(k)
- 动态规划预处理: O(n^2)
(2) 二项式定理[6]
1 | // 二项式展开模板 |
解题思路
- 计算(x+y)^n展开式的系数
- 使用组合数计算各项系数
- 适用于多项式展开问题
题目特征
- 需要多项式展开
- 涉及组合数学问题
- 需要高效计算系数
时间复杂度
- O(n)
17. 数据结构
(1) ST表[5-6]
1 | // ST表模板(区间最大值查询) |
解题思路
- 预处理区间最值
- 支持O(1)查询
- 适用于静态区间查询
题目特征
- 需要频繁查询区间最值
- 数据静态不修改
- 查询次数远大于预处理时间
时间复杂度
- 预处理O(nlogn)
- 查询O(1)
(2) 堆[5-6]
1 | // 堆模板(优先队列实现) |
解题思路
- 完全二叉树结构
- 父节点优于子节点
- 高效获取极值
题目特征
- 需要频繁获取极值
- 需要动态维护有序集合
- 常见于调度问题
时间复杂度
- 插入O(logn)
- 获取极值O(1)
- 删除极值O(logn)
(3) 树状数组[5-6]
1 | // 树状数组模板 |
解题思路
- 高效维护前缀和
- 支持单点更新和区间查询
- 二进制索引技术
题目特征
- 需要频繁更新和查询前缀和
- 数据动态变化
- 需要高效统计
时间复杂度
- 更新O(logn)
- 查询O(logn)
研究生及大学A组
19. 字符串
(1) AC自动机[7-8]
1 | // AC自动机模板 |
解题思路
- 结合Trie树和KMP算法
- 构建失败指针实现高效多模式匹配
- 适用于大量模式串的匹配问题
题目特征
- 需要同时匹配多个模式串
- 文本串较长
- 模式串有公共前缀
时间复杂度
- 构建O(Σ|P|)
- 匹配O(|T| + m)
(2) 拓展kmp[7-8]
1 | // 拓展kmp模板 |
解题思路
- 计算字符串每个位置的最长公共前缀
- 利用已匹配信息优化计算
- 适用于字符串匹配和比较问题
题目特征
- 需要比较字符串的所有后缀
- 需要高效计算最长公共前缀
- 常见于字符串匹配问题
时间复杂度
- O(n+m)
22. 字符串匹配算法
(1) KMP算法[7-8]
1 | // KMP算法模板 |
解题思路
- 预处理模式串生成部分匹配表
- 利用已匹配信息避免重复比较
- 线性时间复杂度
题目特征
- 需要高效字符串匹配
- 模式串有重复子串
- 适用于大文本搜索
时间复杂度
- O(n+m)
(2) Trie树[7-8]
1 | // Trie树模板 |
解题思路
- 前缀树数据结构
- 高效字符串存储和检索
- 支持前缀匹配
题目特征
- 需要处理大量字符串
- 需要前缀匹配或自动补全
- 适用于字典类问题
时间复杂度
- 插入和查询均为O(L)
23. 高级图论算法
(1) 最小生成树[7-8]
1 | // Kruskal算法模板 |
解题思路
- 贪心选择最小权边
- 使用并查集检测环
- 适用于连通图
题目特征
- 需要连接所有节点
- 要求总权重最小
- 适用于网络设计问题
时间复杂度
- O(ElogE)
(2) 拓扑排序[7-8]
1 | // 拓扑排序模板 |
解题思路
- 计算节点入度
- 从入度为0的节点开始处理
- 适用于有向无环图
题目特征
- 需要处理依赖关系
- 检测有向图是否有环
- 适用于任务调度问题
时间复杂度
- O(V+E)
24. 数论算法
(1) 快速幂[7-8]
1 | // 快速幂模板 |
解题思路
- 利用二进制分解指数
- 通过平方减少乘法次数
- 适用于大数幂运算
题目特征
- 需要计算大数幂
- 需要取模运算
- 常见于加密算法等问题
时间复杂度
- O(log n)
(2) 欧拉筛法[7-8]
1 | // 欧拉筛法模板 |
解题思路
- 线性筛法求素数
- 每个合数只被最小质因数筛除
- 适用于大规模素数筛选
题目特征
- 需要高效生成素数表
- 需要处理大范围素数问题
- 适用于数论相关问题
时间复杂度
- O(n)
25. 高级搜索技巧
(1) 双向BFS[7-8]
1 | // 双向BFS模板 |
解题思路
- 同时从起点和终点开始搜索
- 减少搜索空间
- 适用于已知起点和终点的最短路径问题
题目特征
- 需要寻找两点间最短路径
- 搜索空间较大
- 适用于对称性问题
时间复杂度
- O(b^(d/2))
(2) A*算法[7-8]
1 | // A*算法模板 |
解题思路
- 使用启发式函数指导搜索方向
- 结合Dijkstra和贪心算法
- 适用于有启发信息的路径规划
题目特征
- 需要寻找最优路径
- 有可用的启发式函数
- 适用于地图导航等问题
时间复杂度
- 取决于启发式函数质量
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 诒森的博客!
评论