
my algorithm summary
个人总结
ShellDawn
Gu-Ah
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
算法:数组上计数问题
逆序数对个数: 见:https://blog.csdn.net/ShellDawn/article/details/90242661 数组上和为指定值的二元数字对数量:原创 2019-05-18 23:42:43 · 569 阅读 · 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 · 397 阅读 · 0 评论 -
算法:图论问题
问题A: 给出N个顶点度数,判断是否可图? 贪心方法尝试构图,时间O(NNlogN) 每次找出度数最大的点,与其后数个点构成边,构成边后,两个顶点度数-1。 但凡有一个顶点不能构成边,则不可图。 ...原创 2019-05-27 08:45:44 · 511 阅读 · 0 评论 -
算法:设计LRU和LFU缓存结构
LRU:least recently used 最近不使用 双端队列+哈希 哈希来判断是否在双端队列中 双端队列来模拟使用先后 LFU:least frequently used 最不经常使用 双向列表形成多个桶,每个桶按序表示使用次数为1,2,… 在每个桶里按使用先后挂链。 ...原创 2019-05-26 22:30:16 · 471 阅读 · 0 评论 -
算法:Manacher算法找回文子串
预处理: 将字符串每个位置插入特殊符号“#”,例如“abba”为“#a#b#b#a#”,这样每个偶数或奇数回文串都被处理成了奇数回文串。 Manacher算法核心思想: 利用之前回文串的信息来提供当前串的先验信息。 需要维护2两个变量和一个数组: 变量R代表已经发现的所有回文串中可以到达最右的那个回文串的右边界, 变量Center代表满足上述条件回文串的对称中心位置, Parr[i]代表以i为中...原创 2019-05-26 19:40:28 · 305 阅读 · 0 评论 -
算法:字符串问题
问题A: 字符串正则匹配: 见:https://blog.csdn.net/ShellDawn/article/details/90258896 问题B: 旋转字符串判断: 将字符串前面任意部分挪到后面形成新字符串,则新旧字符串互为旋转字符串。 思维+KMP,时间O(N) 将某一字符串变为2倍长,首尾拼接,则旋转字符串一定在其之间。 问题C: AC自动机。 见:https://blog.csd...原创 2019-05-22 14:47:29 · 224 阅读 · 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 · 6921 阅读 · 0 评论 -
算法:数组最长问题
未排序数组累加和为指定值的最长长度: 哈希+前缀和,时间O(N) 哈希保存(sum,loc),已经遍历过的累加和及其最后位置。 未排序数组累加和为指定值的最长长度,额外要求正负数个数相同: 哈希+前缀和,时间O(N) 使用两个数组,一个原数组采用上面方法。 另一个数组将负数置为-1,正数置为1,则累加和为0为正负个数相同 未排序数组只有0和1,累加和为指定值的最长长度,且0和1个数相同: 哈希...原创 2019-05-17 10:01:13 · 388 阅读 · 0 评论 -
算法:拓扑排序
拓扑排序用于AOV网络,结果不唯一。 步骤为: 找到一个入度为0的点,输出, 删除该点及其边 找下一个入度为0的点。 若执行完毕后,存在未输出的点,则此图是有环图。 实现上: 维护一个数据,记录每个点的入度。 维护一个栈,把找到的入度为0的点压入。 维护一个邻接表,记录出边。 ...原创 2019-05-27 18:50:47 · 351 阅读 · 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 · 585 阅读 · 0 评论 -
算法:欧拉公式
凸多面体: 顶点数 + 面数 - 棱数 = 2 平面图: 顶点数 + 区域数 - 边数 = 2原创 2019-07-09 19:43:31 · 543 阅读 · 0 评论 -
算法:差分约束
差分约束系统: 不等式组,每个不等式都是差的形式,如Xi - Xj <= C 差分约束要么无解,要么无穷解。 因为,假设有一组解,那么K*Xi也是一组解,K+Xi也是一组解,差分会消去常数和倍数。 最短路算法SPFA可以求差分约束系统的一个解。 构造差分系统: 三角不等式: v - u < k d[v] <= d[u] + edge[u][v] 每个Xi + Xj <= ...原创 2019-05-30 01:49:17 · 225 阅读 · 0 评论 -
算法:网络流问题
最大流: Ford-Fulkerson算法: 时间O(nmU),时间和每条路径容量有关。 增广路思想, 遍历k次图,每次找一条增广路, 找的方法为BFS,记录前驱节点同时记录最小路径容量,访问过的节点不再访问,直到BFS到汇点,这样就找到一条增广路。 对增广路扩流,将所有路径容量减去记录的最小路径容量,若容量为0,则删掉该路径,ans累加此最小路径容量。 接下来,重复BFS,直到访问不到汇点为止...原创 2019-05-31 21:26:21 · 342 阅读 · 0 评论 -
算法:图遍历问题
欧拉回路: 每条边只走一次 欧拉回路判定:仅有两个奇数度点,或没有奇数度点。 找欧拉回路: DFS搜索,POJ1780,相同位作为边,不用位作为点,稠密图,DFS容易得到结果 Fleury算法,在每个dfs状态中,能不走桥就不走桥,即可。 哈密顿回路: 每个点只走一次 哈密顿路判定:目前还没有成熟的哈密顿回路充要条件。 POJ2288 岛屿和桥 状压DP: dp[status][lastA]...原创 2019-05-31 19:29:43 · 606 阅读 · 0 评论 -
算法:最短路径问题
单点最短路,非负权: Dijkstra算法: 动态规划思想,时间O(N*N) 维护一个最短路数组dis,不断更新。 维护一个vis数组,选择dis最小且未访问节点。 若需要打印最短路径,则维护一个father数组,记录前驱节点。 例题,POJ1135 多米诺骨牌效应: Dijkstra算法求每个关键牌的倒下时间为time[i] 再求每条边倒下的最终时间,(time[i]+time[j]+Edge[...原创 2019-05-28 12:12:38 · 550 阅读 · 0 评论 -
算法:一致性哈希算法 与 岛问题
工程师采用服务器集群实现数据缓存: 线性缓存区,key%N选择存放服务器, 缺点,增加或删除节点代价会很高,像数组一样,所有数据需要迁移。 环形缓存区,所有key取值首尾相接,顺时针计算,key存放距离最近的服务器,当插入新节点时,需要迁移的数据很少。 缺点,由于节点摆放位置不同,有可能造成节点负载不均衡。 一致性哈希算法,在环形缓存区上,设置大量虚拟节点,通过提高密度,来减少单一节点之间的差距,...原创 2019-05-23 22:48:32 · 188 阅读 · 0 评论 -
算法:最小生成树MST
克鲁斯卡尔: 贪心思想,适合稀疏图,O(ElogE) 用堆维护边,最小权边优先考虑。 并查集加速联通分量的判断。 例题:ZOJ1203,POJ1861,POJ1251,POJ2031,POJ2421 普里姆: 贪心思想,适合稠密图,O(N*N) 维护一个长度为N的数组,保存当前可到达点的最短距离,若目前无法到达则INT_MAX,若已经计算过,则-1。 例题:ZOJ1586,POJ1789 ...原创 2019-05-27 23:28:58 · 339 阅读 · 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 · 1292 阅读 · 0 评论 -
算法:位运算 与 n皇后问题
返回N皇后摆法有多少种? 递归函数,维护三个变量和一个常量: 常量:upperLim 代表棋盘大小,末尾n个1,例如八皇后,00…011111111 变量: nowLim 代表当前列每行可以放皇后的位置,0表示可以放,1表示不可以。 leftLim 代表已放置皇后左斜线到当前行的影响,0表示可以放,1表示不可以。 rightLim 代表已放置皇后右斜线到当前行的影响,0表示可以放,1表示不可以。...原创 2019-05-21 22:58:00 · 416 阅读 · 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,7 morris遍历的核心是, 1,找到当前节点左子树最右节点,让其右指针指向当前节点,并向左移动当前指针。 2,若已经指向当前节点,则其右指针置为空,当前节点...原创 2019-05-20 16:58:57 · 343 阅读 · 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 · 122 阅读 · 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 · 464 阅读 · 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 · 454 阅读 · 0 评论 -
算法:树问题
问题A: 判断一棵树里是否含有另一棵树的结构: 遍历每个节点判断,时间复杂度O(N*M) 问题B: 找到二叉树中的最大搜索二叉子树: 树形dp,时间O(N),空间O(h) 递归处理,从下向上,每个节点记录其和其子树中最小值和最大值。 每个节点同时记录是否为搜索子树的根,然后不断合并。 问题C: 找到二叉树中的最大搜索二叉树结构: 树形dp,时间O(N*h),空间O(N) 每个节点维护拓扑贡献记...原创 2019-05-19 14:20:15 · 234 阅读 · 0 评论 -
算法:数学问题
约瑟夫环问题: 0~n-1组成一个环,每次删除顺时针第m个元素,最后剩下哪个? 每轮删除后,新坐标->原坐标映射关系为,(i+m)%(n + 1) 通过最后一次坐标不断反求之前坐标。 注:1~n组成环,则映射为,(i+m-1)%n + 1 ...原创 2019-05-19 13:32:52 · 234 阅读 · 0 评论 -
算法:动态规划问题
n个骰子和为s的概率: dp,时间O(ns6),空间O(s) dp计算一个长度为s+1的数组,dp[i]表示和为 i 的次数。 概率分母一定是6^n,分子即为dp[s]原创 2019-05-19 13:23:59 · 253 阅读 · 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 · 249 阅读 · 0 评论 -
算法:二叉树中两节点最近公共祖先节点
只有一次查询: 递归处理,时间O(N) 频繁查询: 打出所有两两节点组合的哈希表,方便查询,时间O(N*N) M次查询: 哈希+并查集,时间O(N+M) 思想,从下向上合并节点,每次依据左子树合并根节点,再合并右子树的顺序,只对新加入的节点考虑是否有对应查询,有的话返回并查集合并后的公共祖先即可。 ...原创 2019-05-20 19:16:54 · 408 阅读 · 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 · 254 阅读 · 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 · 480 阅读 · 0 评论 -
算法:单向链表相交
无空间限制,哈希算法 空间限制,O(1) 1,单链表自环: 一个2步快指针,一个1步慢指针。 若有自环一定相遇。 相遇后,慢指针不动,快指针改为1步,指向头节点。 然后同时移动两个指针,再次相遇时是环入口节点。 2,无环链表相交: 分别记录链表长度 相同结尾则相交,长度差是相交点。 3,有环链表相交: 若相交一定是相同的环,否则是两个自环 找到链表1的自环点,和链表2的自环点。 然后链表1自环跑...原创 2019-05-16 17:23:12 · 338 阅读 · 0 评论 -
算法:加油站良好的出发点
N个加油站逆时针组成一个环,每个加油站最多加oil[i]的油量,该加油站距下个加油站距离dis[i],1个油可以走1个距离,初始车里没有油,则从哪些加油站出发可以逆时针一圈后回到出发点。 类似dp的思维题,时间O(N) 该方法实现O(N)的核心思想在于,先找到一个良好出发点,再顺时针找可以到达该良好出发点的出发点,即新良好出发点,依次顺时针找,若顺时针一圈后仍然没有良好出发点,则所有点都不会是。 ...原创 2019-05-25 14:56:47 · 625 阅读 · 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 · 306 阅读 · 0 评论 -
算法:大楼轮廓问题
每栋楼有左边界L,右边界R,高度H,现在有N栋楼,有可能相互遮挡,问每个坐标最大高度是? 线段树 or 有序表 ? 时间O(NlogN) 线段树: 初始叶节点为0,非叶节点置为0x1000,一个负数表示未处理,[L,R]边界更新线段树节点最大值。 输出时,线段树求解[0,N-1],若为负数,则找子节点,直到某个区间找到一个非0的数。 有序表: 所有楼按左边界,右边界拆分成两种记录,(坐标loc,高...原创 2019-05-24 22:20:42 · 723 阅读 · 0 评论 -
算法:贪心问题
问题iA: 做项目最大收益问题: 给定初始启动资金,W,最多可揽的项目数K 再给N个项目,启动资金要求和收益。 贪心思想,时间O(KlogN) 维护一个收益大根堆,费用小根堆。 初始所有项目扔到收益大根堆中,按贪心思想依次挑选,若超过启动资金,则弹出扔到费用小根堆中,每当启动资金更新时,考察一下费用小根堆中的项目,将满足要求的项目再次扔到大根堆中。 注:K次挑选只挑选大根堆中的项目。 ...原创 2019-05-24 20:03:12 · 195 阅读 · 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 · 571 阅读 · 0 评论 -
算法:Tarjan算法
目标:找联通图的关节点及其联通分量 时间:邻接矩阵O(N^2)、邻接表O(E) 关节点:去掉该点后,剩余图不是个联通图,剩余联通图的数量为所求联通分量。 基本思想,采用一次DFS计算每个点在搜索树中的层级。 维护: dfn[x]:表示点x在搜索树中搜索次序,依次递增 low[x]:表示点x必须通过子节点路径可以到达的最小层次(最祖先节点)。 subnets[x]:表示去掉点x后的联通图数量 充...原创 2019-07-09 23:48:44 · 531 阅读 · 0 评论