随笔分类 - Algorithm
摘要:本质上是使用二分查找 注意:在考虑二分的边界时,可以不用数组的下标边界进行替代,而是直接使用极大的数进行替代 1 class Solution { 2 public: 3 double findMedianSortedArrays(vector<int>& nums1, vector<int>& n
阅读全文
摘要:一、区间问题 1、区间选点、最大不相交区间数量 先按右端点排序,遇到完全不相交的区间则更新当前点,并将区间数量+1. 2、区间分组 将区间分组使组内区间不相交,求分组的最小数量。 左端点从小到大排序,从前往后处理每个区间,判断是否能放入当前的某个组中, 如果能,则更新组的右端点,否则开新组。 3、区
阅读全文
摘要:可以用0x3f3f3f3f表示int正无穷 0xc0c0c0c0表示int负无穷 二者都是1e9级别,且可利用memset初始化。 负无穷也可以选择-0x3f 对于double,用科学计数法存储,初始化 -1可以视为-NAN
阅读全文
摘要:1、背包问题 (1)01背包 每件物品仅用一次 可以做空间优化 dp[j]=max(dp[j],dp[j-v[i]]+w[i]); 0,1背包状态均是从前一循环的状态转移 注意如果不使用空间优化时,要对小于当前重量的dp位置进行赋值(为上一轮dp的值)!! (2)完全背包 每件物品可以用无限次 dp
阅读全文
摘要:容斥原理:求集合交集的元素个数 Nim游戏:通过异或结果,直接判断游戏先手是否必胜 对于多个集合,可以计算sg函数,推广Nim
阅读全文
摘要:对质数p 根据费马小定理 有a^(p-1)≡1(mod p)(其中的p-1是p的欧拉函数,见数论的欧拉定理) 则a*a^(p-2)≡1(mod p) a^(p-2)≡1/a(mod p) 即有,1/a(逆元)≡a^(p-2)(mod p)
阅读全文
摘要:0和1的排列转化为二维路径 C(n,2n)-C(n-1,2n)=C(n,2n)/(n+1)(卡特兰数)
阅读全文
摘要:一、高斯消元 对矩阵n*n*x=列向量n 枚举每一列(c+,r) 1、找到当前列绝对值最大的行(如果为0则下一列) 2、将当前行与1、中的行的元素交换 3、将当前行的当前列元素化为1 4、利用当前行的元素,将后面行的当前列的元素化为0(先枚举后面的行,后面的行的当前列元素不为0,则每个列都消) 5、
阅读全文
摘要:1、欧拉函数的定义是,φ(n)是1-n中与n互质的数的个数 对n分解质因数得p1^a1*p2^a2*...*pn^an, 则φ(n)=n*(1-1/p1)(1-1/p2)*...*(1-1/pn); 对多个数求欧拉函数,可以结合线性筛法,对每个质数和被筛到的数,都根据已经被循环到的数的φ计算 1 c
阅读全文
摘要:课程中提供的,hash_val函数,输入参数为类的全部数据,返回值为std:stze_t的哈希值 1 2 template<class T> 3 inline void hash_combine(std::size_t & seed, const T & val){ 4 seed ^= hash<T
阅读全文
摘要:一、质数 质数是大于1的自然数,只包含1和本身两个约数。 1、质数的判定,O(sqrt(n)) 试除法,推荐循环i<=n/i(防止溢出和sqrt计算) 2、分解质因子,O(logn~sqrt(n)) 1 for(int i=2;i<=n/i;i++) 2 { 3 if(n%i==0) 4 {//此时
阅读全文
摘要:一、最小生成树 1、prim算法 和dijkstra算法很像 (1)朴素版 O(n^2) 适合稠密图 dijkstra算法每次更新到起点的距离,prim算法每次更新到集合的最短距离(用邻接点到当前被加入点的距离更新)(集合为已经生成的树) 858 Prim算法求最小生成树 1 #include<io
阅读全文
摘要:最短路问题 一、单源最短路(一个点到所有点的最短距离) 1、所有边的权重都为正 n个点,m个边 (1)朴素dijkstra O(n^2) 适合稠密图,O(n^2)=O(m) 算法步骤: ①初始化距离 dis[1]=0,dis[i]=+∞,集合s为已经找到的点的集合 ② for i=1:n 找到点t,
阅读全文
摘要:图可以用邻接表存储, 邻接表为n个链表, 链表可以用数组模拟(比vector速度快)。 const int N; int h[N],e[N],ne[N],idx;//分别表示,h[i]:图中编号i的头结点,e[i]:节点i的值(编号),ne[i]节点i在链表中的下一个节点的idx。 void add
阅读全文
摘要:memset按字节赋值, 常用的参数有 0(0),-1(值为-1,因为-1按补码存储,每一位都是1),0x3f(+∞),-0x3f(值为-∞,和-0x3f3f3f3f不等),0xc0(-∞) 头文件cstring 对于double,用科学计数法存储,初始化 -1可以视为-NAN
阅读全文
摘要:整数哈希: 一般可以用取模的方式,模的数(数组长度)最好取质数且离2的幂尽可能远 哈希冲突可以用拉链法和开放寻址法解决 拉链法可以用链表进行模拟,插入时在哈希寻址处的链表头结点插入 开放寻址法则直接向后找(经验值,数据长度一般要开到题目数据范围的2-3倍),利用find函数找到数据的位置或应该插入的
阅读全文
摘要:堆可以用二叉树存储。 当前节点比左右子节点的值都小或等于(小根堆)。 对于完全二叉树,根节点编号为1,则,对于编号为n的节点,左子节点编号为2n,右子节点标号为2n+1。 完全二叉树可以用一维数组存储(编号→下标) 基本操作:up和down up:当节点数值比父节点小时,交换当前节点与父节点的值,然
阅读全文
摘要:并查集支持操作: 1、将两个集合合并 2、询问两个元素是否在一个集合当中 每个集合用一棵树来表示,以根节点编号表示整个集合,每个节点存储父节点p[x] 判断树根 if(p[x]==x) 求集合编号 while(p[x]!=x) x=p[x]; 合并集合:x和y,x→根节点x,p[x]=y。 优化:路
阅读全文
摘要:Trie树可以用来存储前缀字符串/数组。 可以用数组进行模拟 son[N][26] 记录节点的son cnt[N] 记录以当前节点为最后字符的字符串出现的次数 idx当前用到的节点 例题 143. 最大异或对 #include<iostream> using namespace std; const
阅读全文
摘要:KMP用于o(n)的字符串匹配。 使用next数组记录以当前阶段为后缀的,和以开始位置为前缀匹配的最长长度,即匹配过程中进行后移后保留的长度。 next数组的计算和匹配过程类似。 推荐数组从1开始计数 注意,自身match时,是不包含当前位置的前缀,而互相match时,是包含当前位置的前缀,所以两次
阅读全文

浙公网安备 33010602011771号