随笔分类 - 算法学习
摘要:算法分类 1、排序 比较类排序 2、复杂度 相关概念 稳定:如果 a 本来在 b 前面,而a = b ,排序之后 a 仍然在 b 的前面 不稳定:如果 a 本来 在b的前面,而 a = b ,排序之后 a 可能在 b 的后面 时间复杂度:对排序数据的总的操作数,反映当 n 变化时,操作次数呈什么变化
阅读全文
摘要:模拟散列表 把一个较大范围内的数转化为较小范围的数的集合。 模上一个数(x%N+N)%N防止下标出现负数 数据结构 用一个数组表示要插入的槽,如果哈希产生了冲突,则把数插入到槽中(单链表)。 数组+模拟链表 拉链法 实现代码: #include<cstring> #include<iostream>
阅读全文
摘要:容器一些基本操作语法 vector 初始化操作 vector<int> a; //声明向量 vector<int> a(10); //声明一个初始大小为10 的向量 vector<int> a(10,1); //初始大小为10,且值都为 1的向量 vector<int> b(a); //声明并用向量
阅读全文
摘要:算法笔记 欧几里得算法求最大公约数 ~又称辗转相除法,求两数的最大公约数 gcd(a,b) = gcd(b,a%b) 一般代码递归形式 int gcd(int a,int b) { return b? gcd(b,a%b) :a ; } 迭代形式 int gcd(int a,int b) { whi
阅读全文
摘要:KMP KMP-字符串匹配算法,pat模式串,长度为M; txt文本串,长度为N。KMP算法是在txt中查找子串pat,如果存在,返回起始索引,否则返回-1 。 https://zhuanlan.zhihu.com/p/83334559这个知乎专栏讲得很好 根据上面的理解 1、如果是暴力枚举的话,就
阅读全文
摘要:1、分解质因数 #include<iostream> #include<cmath> #include<cstring> using namespace std; int main() { int n; cin >> n; while(n--) { int x; cin >> x; for(int
阅读全文
摘要:刷题记录 AcWing 1117. 单词接龙 (DFS,搜索顺序) AcWing 1116. 马走日 AcWing 190. 字串变换 小猫爬山 2549. 估计人数(蓝桥杯国赛)
阅读全文
摘要:树状数组 树状数组:O(logn) 操作:1、给某个位置上的数加上一个数 (单点修改) 2、求某一个前缀和 (区间查询) 支持修改和查询同时进行,是在线的 树状数组下标 所在的层次:x的二进制最后有几个0 C[x]表示的数的范围:\((x - 2 ^k, x] = (x - lowbit(x), x
阅读全文
摘要:A.双阶乘 问题描述 一个正整数的双阶乘,表示不超过这个正整数且与它有相同奇偶性的所有正整数乘积。 n 的双阶乘用 n!! 表示。 例如: 3!! = 3 × 1 = 3。 8!! = 8 × 6 × 4 × 2 = 384。 11!! = 11 × 9 × 7 × 5 × 3 × 1 = 1039
阅读全文
摘要:https://www.cnblogs.com/hulean/p/11144059.html 洛谷模板题 题目:最近公共祖先LCA ,最近公共祖先是指在有根树中,找出某两个结点 和 最近的公共祖先。 怎么求? 当要求两个结点的,我们可以先让这两个结点跳到同一
阅读全文
摘要:记忆化搜索是DFS+动态规划的一种搜索算法,在进行动态规划的同时我们也记录递归过的状态,这样就避免了重复递归搜索,即在递归的同时记录已更新状态.。 例题 AcWing901 滑雪
阅读全文
摘要:Flood Fill 通过初始的一个位置,覆盖该位置周围有关联的格子, 可以在线性时间复杂度内,找到某个点所在的连通块 题目 池塘计数 城堡问题 山峰和山谷 最短路模型 计算到达某个位置需要的最短步数、最短路径 使用BFS第一次搜到目标的结果就是最短的,只要遍历从该点出发的所有情况,且进行标记判重,
阅读全文
摘要:【动态规划 | 树形DP小结】 参考:RioTian 树形DP,一般是在树上进行DP,由于树固有的递归性质,树形DP一般都是递归进行的。这是说我们的树其实是可以递归定义的,树的每一颗子树也是一个完整的树,直到叶子结点可以看做是递归终点。 树形DP是先算子树再进行合并,在实现上与树的后序遍历相似,即左
阅读全文
摘要:状态压缩DP 对于某些动态规划问题,可以用深搜来枚举状态,但是那样的话时间复杂度就太高了。对于此类问题我们采用二进制表示状态,用1和0来表示某位置不同的状态。 1、对于状压DP问题,我们一般取一个初始状态。确定状态数组的含义。 2、明确相邻状态的转移,一般我们可以记录某个状态可以转移的相邻状态(打表
阅读全文
摘要:算法基础课部分题目总结 第一章 基础算法 快速排序 快速排序 第k个数 归并排序 归并排序 逆序对的数量 二分 数的范围 数的三次方根 高精度 高精度模板 前缀和与差分 前缀和差分模板 双指针算法 最长连续不重复子序列 数组目标的元素和 判断子序列 位运算 二进制中1的个数(题解中有总结的方法) 离
阅读全文
摘要:理解 动态规划是指把一个问题分成若干个子问题,通过局部最优解得到全局最优的一种算法策略或者说一种思想方法,简单来讲就是用一个数组表示我们要求的问题的答案:由前一个问题的答案推出另一个问题的答案。 dp一般有三个步骤: 1、设计状态:设计合适的数组以及相应的含义。 2、状态转移方程:从已知问题的答案推
阅读全文
摘要:滚动数组 作用在于优化空间,主要应用在递推或动态规划中,可以循环利用空间。 例如斐波那契数列,只由前面两个元素得出下一个元素 int d[]; d[0] = d[1] = 1; for(i = 2;i<80;i++) { d[i%3] = d[(i-1)%3] + d[(i-2)%3]; } 二维数
阅读全文
摘要:区间DP 区间DP常用模板 所谓区间DP,指在一段区间上进行动态规划,一般做法是由长度较小的区间往长度较大的区间进行递推,最终得到整个区间的答案,边界就是长度为1和2的区间 所有的区间DP问题,有两种写法 1、第一维都是枚举区间长度,第二维枚举起点,先求出小区间的属性值,进而扩展到大区间 核心思想:
阅读全文