算法总复习
2026-09-26 11:58:12
发布于:上海
算法总复习
结构体排序
概念
当一个对象有多个属性(如学生:姓名,成绩,学号,性别)时,我们用结构体把他们打包在一起。排序的时候需要自定义比较规则,告诉sort函数**"谁排前面"**。
核心要点
- 用
struct定义定义结构体,把相关数组织组织在一起。 - 在比较函数
cmp时,返回true
$时表示第一个参数在前面。 -
struct stu{ int id;//学号 int score;//成绩 } //先按成绩降序排序,再按学号升序排序 bool cmp(stu a,stu b){ if(a.score ! b.score) return a.score > b.score; else return a.id < b.id; } - 多关键字排序:先比较主关键字,主关键字相同时,比较次关键字。
识别信号
- "按X排序,若相同则按Y排序":多关键字排序问题。
- "输出排名","第k名","前m名":先排序再取数据。
筛法
概念
判断质数和批量求质数是完全不同的两个问题。
判断质数(试除法:枚举2~n-1,看看是否n的因子)
bool is_prime(int n){
if(n < 2) return 0;
for(int i = 2;i * i <= n;i++){
if(n % 1 == 0) return false;
}
return true;
}
批量求质数(埃氏筛)(选修)
bool notP[100005];//notP 为true时,表示不是质数
int primes[100005],cnt;//储存质数
void sieve(int n){
notP[0] = notP[1] = 1;
for(int i = 2;i <= n;i++){
if(!notP)){
primes[++cnt] = i;
for(int j = 2 * 1;j <= n;j += i){\
`notP[j] = 1;
}
}
}
}
枚举
枚举三要素
-确定枚举对象:枚举什么?(枚举答案,枚举分割点,枚举子集)
- 确定枚举范围:循环的范围是从哪到哪。
- 枚举条件:什么样的枚举对象是我需要的。
贪心
概念
贪心算法的核心思想是每一步都做出当前最优的选择,希望局部最有能推导出全局最优
常见贪心策略
-排序后贪心(按照某种规则排序后顺序处理)
-选择当前可选中最大/最小的
- 区间贪心(按照开始/结束/时长排序“
二分查找与二分答案
二分查找概念
在有序数组中查找目标值,每次比较中间元素,将搜索范围缩小一半。
二分答案概念
当答案具有单调性时(即答案可行,但不可行),不直接求答案,而是二分猜答案,每次check答案是否可行。
双指针
概念
双指针是一种用两个变量(代替指针)在数组或序列上同时移动来解决问题的技巧,核心是避免不必要的重复计算。
常见类型
- 同向双指针(滑动窗口):两个指针同向移动。维护一个窗口。用户最长/最短连续子序列问题。
- 相向双指针(碰撞双指针):一个从头,一个从尾向中间靠拢。用于有限数组上的查找。
前缀和与差分
前缀和概念
预处理数组前缀和s[i] = s[i - 1]+a[i],之后任意区间的和可以算出:s[r]-s[l - 1]
差分概念
前缀和的逆运算。构造差分数组d[i] = a[i] - a[i - 1] ,对区间在进行修改,只需要修改两个节点:d[l] +=v,d[r + 1]-=v。最后对差分数组求前缀和还原。
STL数据结构
| 容器 | 特点 | 用途 |
|---|---|---|
| 后进先出 | 括号匹配、表达式求值 | |
| 先进先出 | BFS | |
| 键值对,按键有序 | 计数,离散化 | |
| 有序不重复集合 | 去重,查找 |
递归与深度优先搜索
递归概念
函数自己调用自己,本质是把大问题分解为相同结构的子问题。
深搜概念
DFS是递归最重要的应用,从一个状态出发,沿着一条路径走到底,走不动了就回溯到上一个状态。尝试其他路径。
识别信号
- "所有排列","所有组合","所有方案";用DFS枚举全部方案
- 连通块:用DFS搜索在地图上相同区域。
广度优先搜索
概念
逐渐扩展的搜索方式,先访问距离起点为1的所有状态,在访问距离为2的状态,以此类推。、
识别信号’
- "最少步数","最短距离","最少操作次数":BFS
- "迷宫最短路","从一个变化到另一个状态的最少步骤":影视图BFS
递推与动态规划
递推概念
用已知的数学公式/数学规律,按照顺序从小到大,从大到小。计算出所有的项。
动态规划概念
将原问题划分成一个个子问题,用状态数组描述子问题,通过状态转移方程,计算所有状态的值,并求解出原问题的解。
这里空空如也



















有帮助,赞一个