数据结构和算法笔记
Intro
- 记录数据结构和算法题
- 笔记
背包dp
0-1背包
-
0-1背包指的是容量为W的背包,重量w[i]且价值v[i]的物品,每个物品只有两种状态,取或不取,怎样放入背包使背包中的物品价值最大。
-
二维数组解法,内存过大
1 |
|
-
一维数组解法
1 |
|
完全背包
-
在01背包的基础上,每个物品都可以取任意数量
1 |
|
并查集
-
并查集的实现是一个森林,其中每个节点1-n刚开始都是独立的树的根节点,通过维护一个父节点数组来体现哪些节点在一棵树上,一个最基本的带有find和unite操作的并查集实现如下
1 |
|
-
并查集的两个常见优化是路径压缩和启发式合并,路径压缩在查询过程中将节点直接连接到根节点上,减少以后的查询时间,而启发式合并则维护两个集合的大小,总是把大集合的根节点作为小集合的根节点的父节点
树状数组
线段树
dfs & bfs
-
dfs的常用方法在于维护一个全局数组,对访问过的节点标记处理,利用递归搜索,回溯后清除标记
小项
高精度
-
高精度计算利用字符串和竖式加减法实现大整数的四则运算
1 |
|
快速幂
-
快速幂是以$\Theta(log \space n)$时间复杂度计算高次幂的小技巧
1 |
|
gcd和lcm
-
最大公约数欧几里得算法
1 | int gcd(int a, int b) { |
-
扩展欧几里得算法
常用stl库
排序 sort
1 | int nums[100]; |
二分查找 lower_bound()
upper_bound()
1 |
|
-
可以对比两函数返回值,若不同则找到了a[i] == x,差值即为x的个数
set & map
1 | set<int> st; |