
my algorithm summary
个人总结
ShellDawn
Gu-Ah
展开
-
算法:数组上计数问题
逆序数对个数:见:https://blog.youkuaiyun.com/ShellDawn/article/details/90242661数组上和为指定值的二元数字对数量:原创 2019-05-18 23:42:43 · 558 阅读 · 0 评论 -
算法:回文串问题
问题A:给定一个字符串,任意位置可以添加新字符,则最少添加几个变为回文串:dp,时间O(N*N)维护二维表,dp[i][j] 表示 区间[i…j]所需最少字符。转移方程:dp[i][j] = dp[i+1][j-1] or dp[i][j] = min{dp[i+1][j], dp[i][j-1]} + 1问题B:...原创 2019-05-23 00:31:58 · 386 阅读 · 0 评论 -
算法:图论问题
问题A:给出N个顶点度数,判断是否可图?贪心方法尝试构图,时间O(NNlogN)每次找出度数最大的点,与其后数个点构成边,构成边后,两个顶点度数-1。但凡有一个顶点不能构成边,则不可图。...原创 2019-05-27 08:45:44 · 494 阅读 · 0 评论 -
算法:设计LRU和LFU缓存结构
LRU:least recently used 最近不使用双端队列+哈希哈希来判断是否在双端队列中双端队列来模拟使用先后LFU:least frequently used 最不经常使用双向列表形成多个桶,每个桶按序表示使用次数为1,2,…在每个桶里按使用先后挂链。...原创 2019-05-26 22:30:16 · 461 阅读 · 0 评论 -
算法:Manacher算法找回文子串
预处理:将字符串每个位置插入特殊符号“#”,例如“abba”为“#a#b#b#a#”,这样每个偶数或奇数回文串都被处理成了奇数回文串。Manacher算法核心思想:利用之前回文串的信息来提供当前串的先验信息。需要维护2两个变量和一个数组:变量R代表已经发现的所有回文串中可以到达最右的那个回文串的右边界,变量Center代表满足上述条件回文串的对称中心位置,Parr[i]代表以i为中...原创 2019-05-26 19:40:28 · 296 阅读 · 0 评论 -
算法:字符串问题
问题A:字符串正则匹配:见:https://blog.youkuaiyun.com/ShellDawn/article/details/90258896问题B:旋转字符串判断:将字符串前面任意部分挪到后面形成新字符串,则新旧字符串互为旋转字符串。思维+KMP,时间O(N)将某一字符串变为2倍长,首尾拼接,则旋转字符串一定在其之间。问题C:AC自动机。见:https://blog.csd...原创 2019-05-22 14:47:29 · 210 阅读 · 0 评论 -
算法:邮局选址问题
一条直线上有N个居民点,需要建设K个邮局,邮局只能建在居民点上,则所有居民点到最近邮局到最短距离是?动态规划,时间O(N*N)核心思想:外层循环,邮局数量K,直到包括最大邮局:中层循环,区间[0,R],直到包括整个区间:内层循环,从[0,R]区间k个邮局,扩展到[0,R]区间k+1个邮局需要枚举R次。总时间复杂度O(NNK),后面进行细节和时间优化。接下来分析具体过程:dp表设置...原创 2019-05-26 14:55:00 · 6896 阅读 · 0 评论 -
算法:数组最长问题
未排序数组累加和为指定值的最长长度:哈希+前缀和,时间O(N)哈希保存(sum,loc),已经遍历过的累加和及其最后位置。未排序数组累加和为指定值的最长长度,额外要求正负数个数相同:哈希+前缀和,时间O(N)使用两个数组,一个原数组采用上面方法。另一个数组将负数置为-1,正数置为1,则累加和为0为正负个数相同未排序数组只有0和1,累加和为指定值的最长长度,且0和1个数相同:哈希...原创 2019-05-17 10:01:13 · 374 阅读 · 0 评论 -
算法:拓扑排序
拓扑排序用于AOV网络,结果不唯一。步骤为:找到一个入度为0的点,输出,删除该点及其边找下一个入度为0的点。若执行完毕后,存在未输出的点,则此图是有环图。实现上:维护一个数据,记录每个点的入度。维护一个栈,把找到的入度为0的点压入。维护一个邻接表,记录出边。...原创 2019-05-27 18:50:47 · 340 阅读 · 0 评论 -
算法:topK和中位数问题
数组中最小k个数:维护k大小的大根堆,STL使用优先队列,时间O(NlogK),空间O(k)数组中第k小的数:BFPRT算法,时间O(N)int BFPRT(int Arr[],int K);过程:1,将Arr划分5个一组,组内排序找到下中位数,将每组下中位数放到新数组newArr中。2,递归调用BFPRT(newArr, L/2),找到newArr的中位数mid,mid划分Arr...原创 2019-05-18 20:38:25 · 571 阅读 · 0 评论 -
算法:欧拉公式
凸多面体:顶点数 + 面数 - 棱数 = 2平面图:顶点数 + 区域数 - 边数 = 2原创 2019-07-09 19:43:31 · 527 阅读 · 0 评论 -
算法:差分约束
差分约束系统:不等式组,每个不等式都是差的形式,如Xi - Xj <= C差分约束要么无解,要么无穷解。因为,假设有一组解,那么K*Xi也是一组解,K+Xi也是一组解,差分会消去常数和倍数。最短路算法SPFA可以求差分约束系统的一个解。构造差分系统:三角不等式:v - u < kd[v] <= d[u] + edge[u][v]每个Xi + Xj <= ...原创 2019-05-30 01:49:17 · 217 阅读 · 0 评论 -
算法:网络流问题
最大流:Ford-Fulkerson算法:时间O(nmU),时间和每条路径容量有关。增广路思想,遍历k次图,每次找一条增广路,找的方法为BFS,记录前驱节点同时记录最小路径容量,访问过的节点不再访问,直到BFS到汇点,这样就找到一条增广路。对增广路扩流,将所有路径容量减去记录的最小路径容量,若容量为0,则删掉该路径,ans累加此最小路径容量。接下来,重复BFS,直到访问不到汇点为止...原创 2019-05-31 21:26:21 · 334 阅读 · 0 评论 -
算法:图遍历问题
欧拉回路:每条边只走一次欧拉回路判定:仅有两个奇数度点,或没有奇数度点。找欧拉回路:DFS搜索,POJ1780,相同位作为边,不用位作为点,稠密图,DFS容易得到结果Fleury算法,在每个dfs状态中,能不走桥就不走桥,即可。哈密顿回路:每个点只走一次哈密顿路判定:目前还没有成熟的哈密顿回路充要条件。POJ2288岛屿和桥状压DP:dp[status][lastA]...原创 2019-05-31 19:29:43 · 590 阅读 · 0 评论 -
算法:最短路径问题
单点最短路,非负权:Dijkstra算法:动态规划思想,时间O(N*N)维护一个最短路数组dis,不断更新。维护一个vis数组,选择dis最小且未访问节点。若需要打印最短路径,则维护一个father数组,记录前驱节点。例题,POJ1135多米诺骨牌效应:Dijkstra算法求每个关键牌的倒下时间为time[i]再求每条边倒下的最终时间,(time[i]+time[j]+Edge[...原创 2019-05-28 12:12:38 · 539 阅读 · 0 评论 -
算法:一致性哈希算法 与 岛问题
工程师采用服务器集群实现数据缓存:线性缓存区,key%N选择存放服务器,缺点,增加或删除节点代价会很高,像数组一样,所有数据需要迁移。环形缓存区,所有key取值首尾相接,顺时针计算,key存放距离最近的服务器,当插入新节点时,需要迁移的数据很少。缺点,由于节点摆放位置不同,有可能造成节点负载不均衡。一致性哈希算法,在环形缓存区上,设置大量虚拟节点,通过提高密度,来减少单一节点之间的差距,...原创 2019-05-23 22:48:32 · 180 阅读 · 0 评论 -
算法:最小生成树MST
克鲁斯卡尔:贪心思想,适合稀疏图,O(ElogE)用堆维护边,最小权边优先考虑。并查集加速联通分量的判断。例题:ZOJ1203,POJ1861,POJ1251,POJ2031,POJ2421普里姆:贪心思想,适合稠密图,O(N*N)维护一个长度为N的数组,保存当前可到达点的最短距离,若目前无法到达则INT_MAX,若已经计算过,则-1。例题:ZOJ1586,POJ1789...原创 2019-05-27 23:28:58 · 329 阅读 · 0 评论 -
算法:数字与位数问题
1~N整数中,包含位数1的个数。dp算法,时间O(N)假设数字N各个位置上的数组成Arr[n],dp[i] 表示位置i上的1可以出现的次数。当Arr[i] > 1 时,i 位置上1出现的次数只与Arr[i]前面的数字有关。例如,N=21045中数字4所在位置1出现次数。从 00010 到 21019 都是可行的数字,一共2110次,可以发现 2110 = (210 + 1)...原创 2019-05-18 21:27:16 · 1266 阅读 · 0 评论 -
算法:位运算 与 n皇后问题
返回N皇后摆法有多少种?递归函数,维护三个变量和一个常量:常量:upperLim 代表棋盘大小,末尾n个1,例如八皇后,00…011111111变量:nowLim 代表当前列每行可以放皇后的位置,0表示可以放,1表示不可以。leftLim 代表已放置皇后左斜线到当前行的影响,0表示可以放,1表示不可以。rightLim 代表已放置皇后右斜线到当前行的影响,0表示可以放,1表示不可以。...原创 2019-05-21 22:58:00 · 403 阅读 · 0 评论 -
算法:二叉树Morris遍历
时间O(N),空间O(1)morris遍历生成的序列称为Morris序。morris对所有有左子树对节点都会遍历两次。例如满二叉搜索树1,2,3,4,5,6,7,其中4为根节点。morris序为,4,2,1,2,3,4,6,5,6,7morris遍历的核心是,1,找到当前节点左子树最右节点,让其右指针指向当前节点,并向左移动当前指针。2,若已经指向当前节点,则其右指针置为空,当前节点...原创 2019-05-20 16:58:57 · 333 阅读 · 0 评论 -
算法:快速幂
斐波那契数列:f(n) = f(n-1) + f(n-2)解法:f(n),f(n-1) = f(n-1),f(n-2) * | a b c d| #其中,a b c d是2*2矩阵解出,| 1 1 1 0 |之后可以用矩阵快速幂。青蛙一次可以跳上1级或2级台阶,那跳上N级有多少种做法。dp(i) = dp(i-1) + dp(i-2)一头母牛每年生一头小牛,小牛3年后成母...原创 2019-05-15 13:17:41 · 117 阅读 · 0 评论 -
算法:数组中重复数字
数组值范围0~N,找出一个即可:位置交换,时间O(N),空间O(1)不改变空间二分范围,时间O(NlogN),空间O(1)数组值范围不限哈希,时间O(N),空间O(N)对空间要求严格排序,时间O(NlogN),空间O(1)对空间要求严格数组巨大例如上百亿url链接黑名单过滤绝对优秀的哈希函数,上百亿大小比特表缺点,找不到如此优秀哈希函数,且扩展不容易布隆过滤器,容...原创 2019-05-15 11:55:07 · 451 阅读 · 0 评论 -
算法:单调栈
问题A:不重复未排序数组,找到每个位置左边和右边比其小且最近的元素:单调栈,O(N)要找到右边最小,则维护一个递增的栈,直到碰到小值,弹出比其小的值,并更新弹出元素的最近小值。注:栈里保存下标,通过下标访问数组值。注:重复元素同理,稍加修改即可。问题B:给定一个矩阵,只包含0和1,求1组成的最大矩阵:dp+单调栈,O(N*M)例如,1 0 1 1 \n 1 1 1 0 \n ...原创 2019-05-19 23:00:45 · 442 阅读 · 0 评论 -
算法:树问题
问题A:判断一棵树里是否含有另一棵树的结构:遍历每个节点判断,时间复杂度O(N*M)问题B:找到二叉树中的最大搜索二叉子树:树形dp,时间O(N),空间O(h)递归处理,从下向上,每个节点记录其和其子树中最小值和最大值。每个节点同时记录是否为搜索子树的根,然后不断合并。问题C:找到二叉树中的最大搜索二叉树结构:树形dp,时间O(N*h),空间O(N)每个节点维护拓扑贡献记...原创 2019-05-19 14:20:15 · 218 阅读 · 0 评论 -
算法:数学问题
约瑟夫环问题:0~n-1组成一个环,每次删除顺时针第m个元素,最后剩下哪个?每轮删除后,新坐标->原坐标映射关系为,(i+m)%(n + 1)通过最后一次坐标不断反求之前坐标。注:1~n组成环,则映射为,(i+m-1)%n + 1...原创 2019-05-19 13:32:52 · 216 阅读 · 0 评论 -
算法:动态规划问题
n个骰子和为s的概率:dp,时间O(ns6),空间O(s)dp计算一个长度为s+1的数组,dp[i]表示和为 i 的次数。概率分母一定是6^n,分子即为dp[s]原创 2019-05-19 13:23:59 · 234 阅读 · 0 评论 -
算法:数组上窗口问题
数组上滑动窗口的最大值:双端队列,时间O(N)维护一个左端存放当前窗口最大值的双端队列,从左到右元素只能满足降序,否则将最小元素弹出。其中,双端队列只存放下标。例如,2,3,4,2,6,2,5,1步骤:2 -> 3 -> 4 -> 4,2 -> 4,6 -> 6,2 -> 6,5 -> 5,1其中,从第三个正式进入窗口,最大值为4,4,4,...原创 2019-05-19 12:50:03 · 238 阅读 · 0 评论 -
算法:二叉树中两节点最近公共祖先节点
只有一次查询:递归处理,时间O(N)频繁查询:打出所有两两节点组合的哈希表,方便查询,时间O(N*N)M次查询:哈希+并查集,时间O(N+M)思想,从下向上合并节点,每次依据左子树合并根节点,再合并右子树的顺序,只对新加入的节点考虑是否有对应查询,有的话返回并查集合并后的公共祖先即可。...原创 2019-05-20 19:16:54 · 393 阅读 · 0 评论 -
算法:数组上二分问题
有序数组旋转一次后的最值:例如,4 5 6 7 1 2 3二分搜索,平均O(logN),最差O(N)如果num[low] = = num[mid] = = num[high]num[i++] 向右遍历,寻找下一个可以二分的点。三种情况:1,num[low] > num[i] , num[i] 就是断点2,num[low] < num[i] , 断点在num[i … mid...原创 2019-05-15 18:49:39 · 238 阅读 · 0 评论 -
算法:计算几何问题
问题A:判断点在三角形内部:定理:如果O在三角形ABC,那么从三角形的一点出发,逆时针走过所有边的过程中,点O始终都在边的左侧。判断点在左边?利用向量积(叉积),点A(ax,ay)点B(bx,by),则A和B点叉乘为{ axby - aybx }边ab 和点c,如果a叉乘c,c叉乘b,都是正的,则c在ab左侧。注:外积(叉乘)是sin[theta},内积(点乘)是cos{theta}...原创 2019-05-25 16:58:58 · 462 阅读 · 0 评论 -
算法:单向链表相交
无空间限制,哈希算法空间限制,O(1)1,单链表自环:一个2步快指针,一个1步慢指针。若有自环一定相遇。相遇后,慢指针不动,快指针改为1步,指向头节点。然后同时移动两个指针,再次相遇时是环入口节点。2,无环链表相交:分别记录链表长度相同结尾则相交,长度差是相交点。3,有环链表相交:若相交一定是相同的环,否则是两个自环找到链表1的自环点,和链表2的自环点。然后链表1自环跑...原创 2019-05-16 17:23:12 · 329 阅读 · 0 评论 -
算法:加油站良好的出发点
N个加油站逆时针组成一个环,每个加油站最多加oil[i]的油量,该加油站距下个加油站距离dis[i],1个油可以走1个距离,初始车里没有油,则从哪些加油站出发可以逆时针一圈后回到出发点。类似dp的思维题,时间O(N)该方法实现O(N)的核心思想在于,先找到一个良好出发点,再顺时针找可以到达该良好出发点的出发点,即新良好出发点,依次顺时针找,若顺时针一圈后仍然没有良好出发点,则所有点都不会是。...原创 2019-05-25 14:56:47 · 617 阅读 · 0 评论 -
算法:最长上升子序列系列问题
问题A:最长上升子序列:维护一个长度数组,时间O(N*logN)若要返回子序列,则再维护一个位置数组。其中,长度数组含义为,L[i] 表示长度必须为i时,结尾的最小位置,其中最大长度即为所有最长子序列的长度。位置数组与原数组等长,loc[i]表示原数组字符构成子序列后的对应位置。例如:2,1,5,3,6,4,8,9,7最后长度数组为,1,3,4,7,9,最大长度为5,更新为logN...原创 2019-05-21 19:12:05 · 296 阅读 · 0 评论 -
算法:大楼轮廓问题
每栋楼有左边界L,右边界R,高度H,现在有N栋楼,有可能相互遮挡,问每个坐标最大高度是?线段树 or 有序表 ? 时间O(NlogN)线段树:初始叶节点为0,非叶节点置为0x1000,一个负数表示未处理,[L,R]边界更新线段树节点最大值。输出时,线段树求解[0,N-1],若为负数,则找子节点,直到某个区间找到一个非0的数。有序表:所有楼按左边界,右边界拆分成两种记录,(坐标loc,高...原创 2019-05-24 22:20:42 · 709 阅读 · 0 评论 -
算法:贪心问题
问题iA:做项目最大收益问题:给定初始启动资金,W,最多可揽的项目数K再给N个项目,启动资金要求和收益。贪心思想,时间O(KlogN)维护一个收益大根堆,费用小根堆。初始所有项目扔到收益大根堆中,按贪心思想依次挑选,若超过启动资金,则弹出扔到费用小根堆中,每当启动资金更新时,考察一下费用小根堆中的项目,将满足要求的项目再次扔到大根堆中。注:K次挑选只挑选大根堆中的项目。...原创 2019-05-24 20:03:12 · 184 阅读 · 0 评论 -
算法:字符串正则匹配
dp解法,时间复杂度O(NNM),空间复杂度O(N*M)dp[i][j] 表示 str[i…La] 和 pattern[j…Lb] 是否通配动态规划,从后向前推第一,dp[La][Lb]一定为真,两个空串第二,处理dp[i][Lb]部分,表示pattern已经结束,str没有结束,所以全部为假第三,处理dp[La][j]部分,表示str已经结束,pattern没有结束,所以当patter...原创 2019-05-16 10:53:41 · 562 阅读 · 0 评论 -
算法:Tarjan算法
目标:找联通图的关节点及其联通分量时间:邻接矩阵O(N^2)、邻接表O(E)关节点:去掉该点后,剩余图不是个联通图,剩余联通图的数量为所求联通分量。基本思想,采用一次DFS计算每个点在搜索树中的层级。维护:dfn[x]:表示点x在搜索树中搜索次序,依次递增low[x]:表示点x必须通过子节点路径可以到达的最小层次(最祖先节点)。subnets[x]:表示去掉点x后的联通图数量充...原创 2019-07-09 23:48:44 · 512 阅读 · 0 评论