- content {:toc}
三. 进阶_ 算法模板
1 数值处理
1.1 数值处理—–反转数字
|
|
1.2 数值处理——最大公因子
|
|
位运算
位运算符(也称为按位运算符)是用来操作操作数的二进制位的。
- 按位与(&):将两个操作数的每一位进行比较,如果两个操作数在同一位上都是 1,则结果为 1,否则为 0。
- 按位或(|):将两个操作数的每一位进行比较,如果两个操作数在同一位上都是 0,则结果为 0,否则为 1。
- 按位异或(^):将两个操作数的每一位进行比较,如果两个操作数在同一位上相同,则结果为 0,否则为 1。
- 按位取反(~):将操作数的每一位都取反(0 变成 1, 1 变成 0)。
- 左移(«):将左侧操作数的所有二进制位向左移动指定的位数,右侧的空位用 0 补充。
- 右移(»):将左侧操作数的所有二进制位向右移动指定的位数,左侧的空位用符号位(对于有符号类型)或 0(对于无符号类型)补充。
按位亦或
- 一个数和 0 做 XOR 运算等于本身:a^0 = a
- 一个数和其本身做 XOR 运算等于 0:a^a = 0
- XOR 运算满足交换律和结合律:a^b^a = (a^a)^b = 0^b = b
1.3 数值处理——求幂
分为奇数和偶数
1.4 数值处理——求模运算
自然数取余定义分为两种:
- 定义 1:如果 a 和 d 是两个自然数,d 非零,可以证明存在两个唯一的整数 q 和 r,满足
a=qd+r且0 ≤ r < d
(其中 q 为商,r 为余数)。 定义 1 一般作为数学中的取余法则,即两个数取余,余数总是为正数。
|
|
1.5 数值处理——-模幂运算
|
|
字符串数值处理
- 数位 dp
|
|
排序技巧
|
|
2 回溯 = (先根)DFS + 剪枝
|
|
BFS
- 重点在如何表示状态, 以及状态的转变
- 状态的组成必须唯一, 不能有状态是相同的
- 状态的组成必须完备
|
|
3 单调栈
|
|
双指针
滑动窗口的右端点一定会到达答案的右端点,这时候左端点就会收缩到答案的左端点了
图论
4.1 图的遍历( 使用邻接矩阵 )
|
|
图遍历过程中, 有些节点被访问了两次( 遍历时, visit[i] == 1 )的情况:
- 图中有环
- 某节点 的 入度 大于等于 2
要 注意 区分这两种情况
4.2 二分图
定义
二分图的顶点集可分割为两个互不相交的子集,图中每条边依附的两个顶点都分属于这两个子集,且两个子集内的顶点不相邻。
二分图不是 “回溯”
|
|
4.3 判断是否有环
|
|
4.4 拓扑排序
|
|
5.1 双指针——二分查找
|
|
5 双指针——滑动窗口
O(n) 时间内解决 子串, 子数组问题
- 窗口其实就是 [left, right), 窗口大小是 right - left
- right 向右寻找可行解,left 向右寻找最优解
- right 表示待处理的节点
- 等价于枚举左端点
|
|
高级数据结构
前缀和 与 差分
-
我们可以通过如下方式构造其前缀和数组 s:
s[1] = a[1],s[i] = s[i-1] + a[i] (2 ≤ i ≤ n)
-
我们可以通过如下方式构造其差分数组 d:
d[1] = a[1],d[i] = a[i] - a[i-1] (2 ≤ i ≤ n)
, -
原始数组
a[i]=
$\sum(d_i)$, 所以差分是前缀和的逆运算 -
如果想对原数组
[l, r]
内的元素加c
, 只需要对差分数组以下操作d[l]+=c
以及d[r+1] -= c
- 开辟数组的时候, 要多开辟一位