算法
文章平均质量分 71
基础算法
一枚研究生er
研究生er
展开
-
双指针应用
双指针应用原创 2022-09-15 19:50:39 · 804 阅读 · 1 评论 -
2021-01-06
考研结束,开始准备复试和毕设了原创 2021-01-06 15:01:23 · 299 阅读 · 2 评论 -
拓扑排序
拓扑排序:定义:在图论中,拓扑排序(Topological Sorting)是求一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件: 1:每个顶点出现且只出现一次。 2: 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。有向无环图(DAG)才有...原创 2018-12-12 14:35:23 · 333 阅读 · 1 评论 -
传递闭包+例题
目录: 传递闭包: 定义: 求传递闭包的算法----Warshall算法: 例题: 例题一:【POJ-3660】传递闭包:定义:在一个图中,如果i顶点到j顶点能够连通,j顶点到k顶点能够连通,那么i顶点到j顶点就能够连通,我们求出所有满足这种传递性的节点,计算完成后,我们也就知道了任意两个节点是...原创 2018-12-12 09:39:19 · 5681 阅读 · 0 评论 -
暴力递归转动态规划-----2
例题一:换钱的方法数给定数组arr,arr中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求换钱有多少种方法。【举例】arr=[5,10,25,1],aim=0。组成0元的方法有1种,就是所有面值的货币都不用。所以返回1。arr=[5,10,25,1],aim=15。组成15元的方法有6种,分别为3张5元...原创 2018-11-20 08:58:06 · 276 阅读 · 0 评论 -
各种排序算法的比较
转自:https://www.cnblogs.com/zhaoshuai1215/p/3448154.html各种排序算法的比较:排序算法可以说是一项基本功,解决实际问题中经常遇到,针对实际数据的特点选择合适的排序算法可以使程序获得更高的效率,有时候排序的稳定性还是实际问题中必须考虑的,这篇博客对常见的排序算法进行整理,包括:插入排序、选择排序、冒泡排序、快速排序、堆排序、归并排序、希...转载 2018-11-19 09:38:41 · 202 阅读 · 0 评论 -
内存缓存算法-----LRU和LFU
LRU:直接从题目来看:【题目】设计一种缓存结构,该结构在构造时确定大小,假设大小为K,并有两个功能:set(key,value):将记录(key,value)插入该结构。get(key):返回key对应的value值。【要求】1.set和get方法的时间复杂度为O(1)。2.某个key的set或get操作一旦发生,认为这个key的记录成了最经常使用的。3.当缓存的大小超过...原创 2018-11-08 10:49:21 · 377 阅读 · 0 评论 -
扩展KMP
关于扩展KMP算法写的比较好的文章: https://segmentfault.com/a/1190000008663857例题:HDU 6153题意:每组给你两个字符串s1和s2,求s2的所有后缀在s1中出现的频率,频率再乘以对应的后缀的长度,累加。思路:我们将s1,s2字符串翻转,然后进行一次扩展KMP,得到extend数组,然后对extend数组上的每一个值进...原创 2018-08-25 10:28:54 · 667 阅读 · 0 评论 -
数位dp 入门
数位dp几篇很不错的文章:传送门:https://blog.csdn.net/wust_zzwh/article/details/52100392https://www.cnblogs.com/Rlemon/p/3418448.htmlhttps://www.cnblogs.com/zbtrs/p/6106783.html我们接下来直接讲几个例题:例题一:HDU 208...原创 2018-08-07 16:00:51 · 396 阅读 · 0 评论 -
2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 D题
链接:https://www.nowcoder.com/acm/contest/163/D来源:牛客网 In order to become a magical girl, Thinking-Bear are learning magic circle.He first drew a regular polygon of N sides, and the length of each s...原创 2018-08-06 09:43:01 · 414 阅读 · 0 评论 -
2018 百度之星 b题
度度熊的字符串课堂开始了!要以像度度熊一样的天才为目标,努力奋斗哦!为了检验你是否具备不听课的资质,度度熊准备了一个只包含大写英文字母的字符串 A[1,n]=a1a2⋯anA[1,n] = a_1 a_2 \cdots a_nA[1,n]=a1a2⋯an,接下来他会向你提出 qqq 个问题 (l,r)(l,r)(l,r),你需要回答字符串 A[l,r]=alal+1⋯arA[...原创 2018-08-06 08:27:47 · 669 阅读 · 0 评论 -
计蒜客暑假集训第八场 d题
Farmer John owns a farm. He first builds a circle fence. Then, he will choose n points and build some straight fences connecting them. Next, he will feed a cow in each region so that cows cannot pla...原创 2018-08-05 16:11:07 · 324 阅读 · 0 评论 -
计蒜客暑假集训第七场 e题
Ada, Bertrand and Charles often argue over which TV shows to watch, and to avoid some of their fights they have finally decided to buy a video tape recorder. This fabulous, new device can record kk ...原创 2018-08-04 10:18:56 · 321 阅读 · 0 评论 -
快速幂取模和快速积取模 详解
快速幂取模:是用来计算 ( a^b ) % c 的。正常思路:先计算 a^b ,然后将计算所得的结果 mod c, 但是这样有一个隐患,当a,b都很大时,a^b 就更大了,正常的数据类型肯定不可能存下,这就涉及到大数问题,很麻烦。不过我们有一种方式,可以避免出现大数。快速幂取模:我们运用公式:当b为偶数时:a^b mod c = ((a^b/2)^2) mod c当b为...原创 2018-08-02 11:30:17 · 1185 阅读 · 0 评论 -
bfprt算法解析
首先讲一下bfprt算法是干嘛的?bfprt算法是用来求数组中第k小的元素的算法,bfprt算法可以在O(n)时间内求出答案。算法思想:对于求数组中第k小的元素的问题,我们已经有很好的常规算法了,这个算法在最好的情况下时间复杂度是O(n),但在最坏的情况下是O(n^2)的,其实bfprt算法就是在这个基础上改进的。常规解法:我们随机在数组中选择一个数作为划分值(number),...原创 2018-07-26 09:58:29 · 13142 阅读 · 12 评论 -
计蒜客暑假集训第一阶段第4场 f题
Firdaws and Fatinah are living in a country with nn cities, numbered from 11 to nn.Each city has a risk of kidnapping or robbery.Firdaws's home locates in the city uu, and Fatinah's home locates in ...原创 2018-07-25 17:04:22 · 1148 阅读 · 0 评论 -
manacher算法解析
manacher算法是用来求一个字符串的最长回文子串的,这个算法的时间复杂度是线性的O(n)。基本概念:一:回文直径:字符串:abccba -----> 回文直径:6二:回文半径:很显然 3三:回文半径数组:我们定义一个一维数组,数组上i位置记录以字符串i位置字符为中心所得到的回文半径。四:最右回文右边界:当前所得到的回文中最右的位置。五:最右回文右边界的中...原创 2018-07-22 10:27:58 · 284 阅读 · 0 评论 -
Kruskal算法和Prims算法+例题
首先,这两个算法都是求最小生成树的算法。首先,生成树是建立在无向图中的,对于有向图,则没有生成树的概念,所以接下来讨论的图均默认为无向图。对于一个有n个点的图,最少需要n-1条边使得这n个点联通,由这n-1条边组成的子图则称为原图的生成树。一般来说,一个图的生成树并不是唯一的(除非原图本身就是一棵树)。在实际生活中我们常常会遇到这样一些问题:有若干个需要连接的点(不妨假设为一些村庄)和若干...原创 2018-07-19 10:38:12 · 3109 阅读 · 0 评论 -
网络流
容量网络:设G(V,E),是一个有向网络,在V中指定了一个顶点,称为源点(记为Vs),以及另一个顶点,称为汇点(记为Vt);对于每一条弧<u,v>属于E,对应有一个权值c(u,v)>0,称为弧的容量.通常吧这样的有向网络G称为容量网络.弧的流量:通过容量网络G中每条弧<u,v>,上的实际流量(简称流量),记为f(u,v);网络流:所有弧上流量的集合f={f(u,v)}...转载 2018-07-15 11:46:06 · 670 阅读 · 0 评论 -
Dijkstra、Bellman-Ford及Spfa算法思想对比
Dijkstradijkstra算法本质上算是贪心的思想,每次在剩余节点中找到离起点最近的节点放到队列中,并用来更新剩下的节点的距离,再将它标记上表示已经找到到它的最短路径,以后不用更新它了。这样做的原因是到一个节点的最短路径必然会经过比它离起点更近的节点,而如果一个节点的当前距离值比任何剩余节点都小,那么当前的距离值一定是最小的。(剩余节点的距离值只能用当前剩余节点来更新,因为求出了最短路的节点...转载 2018-07-15 10:59:45 · 679 阅读 · 0 评论 -
前缀树 字典树 + 例题
前缀:我们假定一个字符串:abgh,那么abgh就有4个前缀:a,ab,abg,abgh。字符串:jhktgr,有6个前缀:j,jh,jhk,jhkt,jhktg,jhktgr。前缀树:对于上面两个字符串,我们可以做成一个树结构来表示它们:这就是前缀树,每个边代表一个字符还有一种特殊情况:我们假设有2个字符串:abcde,abcdefg。那么它们的前缀树应该如下表示:...原创 2018-06-16 19:37:52 · 1120 阅读 · 0 评论 -
并查集+例题
并查集的功能:1:非常快的检查两个元素是否属于一个集合。2:两个元素各自所在的集合,请你把它合并在一起。并查集的基本组成部分(所用到的数据结构):并查集有三个函数(也可以是两个)一:find函数:寻找某个节点所在集合的头节点。二:union函数:合并两个节点所在的集合。三:issameset函数:判断两个节点是否属于一个集合。所用到的数据结构:数组:定义一个pr...原创 2018-06-14 21:05:32 · 1047 阅读 · 0 评论 -
布隆过滤器 过程详解
布隆过滤器是用来处理爬虫去重问题或者黑名单问题的。爬虫去重问题:将访问过的URL存储在数据库中,对于新进的URL,判断数据库中是否存在这个URL。(URL的量很大)黑名单问题:假设给定100亿个URL是黑名单,用户输入一个URL,判断这个URL是否在黑名单中存在。我们以黑名单问题举例:布隆过滤器:1:首先准备一个比特类型的数组,数组的大小为m。如何准备呢?我们知道,一个...原创 2018-06-02 16:10:41 · 1329 阅读 · 0 评论 -
判断一个二叉树是否为完全二叉树
完全二叉树注意:完全二叉树与节点的标号没有关系其中4号,5号,6号,7号节点为叶节点判断完全二叉树首先每个节点都会有以下4种情况:情况一:情况二: 情况三: 情况四: 我们开始寻找规律:1:如果当前访问的节点的左右孩子是情况3,说明不是完全二叉树,直接返回false。2:如果当前访问的节点的左右孩子是情...原创 2018-05-27 20:33:33 · 28823 阅读 · 5 评论 -
判断一个二叉树是否为搜索二叉树
搜索二叉树二叉树上任何一个节点的左子树上的点都比该节点小,右子树上的点都比该节点大,这样的二叉树称为搜索二叉树。注意:搜索二叉树与节点标号有关系这就是搜索二叉树。判断搜索二叉树由上图可知,如果搜索二叉树按照中序遍历的方式遍历所有的点,那么这些点肯定是递增的,我们只要在中序遍历输出编号时加一个判断条件(当前输出的编号和前一个输出的编号的大小关系)就可以做到判断中序遍历了。...原创 2018-05-27 19:28:18 · 1253 阅读 · 0 评论 -
判断平衡二叉树
平衡二叉树:在一棵树中任何一个节点,它左子树和右子树的高度差不超过一。这就是一个平衡二叉树。 注意:平衡二叉树于节点的标号没有关系这就不是一个平衡二叉树,因为2节点的左子树的高度为2,右子树的高度为0,相差大于1了,所以不是平衡二叉树判断平衡二叉树:通过访问所有的节点,判断以该节点为头节点的子树是否为平衡二叉树。如何判断以该节点为头节点的子树是否为平衡二叉树呢?...原创 2018-05-27 16:03:31 · 2904 阅读 · 1 评论 -
左神课堂之寻找二叉树的前驱节点和后继节点
前驱节点:二叉树中序遍历完成后和这个节点相邻的前面的节点为该节点的前驱节点后继节点:二叉树中序遍历完成后和这个节点相邻的后面的节点为该节点的后继节点中序遍历顺序:8->4->9->2->10->5->1->6->3->74号节点的前驱节点为8号节点,后继节点为9号节点。正常的二叉树的数据结构:struct node{...原创 2018-05-26 18:01:04 · 3946 阅读 · 1 评论 -
kmp算法 入门理解 +例题
kmp算法是用来解决字符串匹配问题的给定一个str1字符串和str2字符串,看一下str1字符串中是否有str2字符串,这就相当于集合中的包含关系,看一下str1字符串是否包含str2字符串。以下内容不是原创kmp算法的基本思想: 这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake Boxer的文章,我才真正理解这种算法。下面,我用自己的语言,试图写一篇比...原创 2018-05-26 13:52:36 · 6393 阅读 · 2 评论 -
线段树 详解
对于线段树的解释:(不是原创)acm刷题时遇到许多连续区间的动态查询问题,例如求取某一区间上元素之和、求取某一区间上元素的最大值,此时如果使用一般的方法求解会使得时间超出要求。此时需要使用到线段树,其主要用于高效解决连续区间的动态查询问题。 线段树,类似区间树,是一个完全二叉树,它在各个节点保存一条线段(数组中的一段子数组),由于二叉结构的特性,它基本能保持每个操作的复杂度为O(lg...原创 2018-05-24 21:47:54 · 213 阅读 · 0 评论 -
树状数组 详解
首先讲一下什么是树状数组:由图可知,原始的数组是a数组,树状数组是e数组。通俗的说:e[1]=a[1];e[2]=a[1]+a[2];e[3]=a[3];e[4]=a[1]+a[2]+a[3]+a[4];e[5]=a[5];e[6]=a[5]+a[6];e[7]=a[7];e[8]=a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8...原创 2018-05-23 19:27:15 · 767 阅读 · 0 评论 -
二分图详解----匈牙利算法+km算法+ Gale-Shapley---婚姻匹配算法算法+例题
先介绍一下基本概念以下基本概念转自其他的博客,不是原创二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。准确地说:把一个图的顶点划分为两个不相交集 和 ,使得每一条边都分别连接 、 中的顶点。如果存在这样的划分,则此图为一个二分图。二分图的一个等价定义是:不含有「含奇数条边的环」的图。图 1 是一个二分图。为了清晰,我们以后都把它画成图...原创 2018-05-22 20:17:21 · 19090 阅读 · 5 评论 -
求最大流的两种算法 EK算法和dinic算法
我们接下来讲的都是按照这个图来讲的 EK算法算法思想,基本流程:通过广搜函数寻找增广路,然后函数返回的是找到的增广路中权值最小的值,如果找不到增广路,返回0。然后运用广搜函数返回的值更新邻接矩阵中的值。每次都把广搜函数返回的值累加,直到图中不存在增广路为止,累加的结果就是最大流。代码如下:#include<bits/stdc++.h>#define MA...原创 2018-05-21 21:59:44 · 2951 阅读 · 3 评论 -
二叉树的3种遍历方法 6种实现
目录:方法一:先序遍历:先序遍历的递归实现:先序遍历的非递归实现:方法二:中序遍历中序遍历的递归实现:中序遍历的非递归实现:方式三:后序遍历后序遍历的递归实现:后序遍历的非递归实现:方法一:先序遍历:遍历顺序:根节点-->左孩子-->右孩子遍历顺序:A-->B-->D-->H-->I-->E-->J...原创 2018-05-19 16:35:17 · 5075 阅读 · 2 评论 -
排序算法之基数排序
注意:以下都是按照升序讲的,降序的时候反过来就行。基本思路:每次按照个位(十位,百位.........)对原始数组进行升序排序。a数组:原始数据存储数组。w数组:桶数组,有两个功能:第一个功能(用来记录位数上的数字出现的次数)第二个功能(用来记录该位上的数字如果为i时应该在a数组中的哪个位置),第二个功能的实现需要第一个功能的数据。temp数组:和归并排序中的help数组功能基本一...原创 2018-05-19 11:30:34 · 536 阅读 · 0 评论 -
透彻理解迪杰斯特拉算法
透彻理解迪杰斯特拉算法2016年03月16日 12:04:51阅读数:50661Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,这个算法我主动学了三遍,第一主动学的时候,是看严蔚敏的《数据结构》,当时应该是学懂了,有点透彻地理解了这个算法,但是没有记录下来,后来就忘记了, 第二次主动学,就去网上找相关文章,看了不少关于这个算法的讲解,但总感觉都没有讲透,看得我二懂二懂的,昨天晚上,突然...转载 2018-05-12 09:33:17 · 364 阅读 · 0 评论 -
快排和归并排序讲解
目录:快速排序归并排序快速排序思路:找数组的最后一个数字,假设为number,然后number为标准,调整数组:数组左边是小于number的数,中间是等于number的数,右边是大于number的数,然后对小于number的部分继续进行上述操作,对大于number的部分继续进行上述操作。这是普通的快速排序,和数据的状态有关,最好的情况的时间复杂度是o(n*log^n)。最好情况...原创 2018-05-10 20:23:42 · 4246 阅读 · 0 评论 -
求最短路的几种算法
目录:floyd-warshall算法(邻接矩阵) 能够解决多源最短路径dijkstra算法(邻接矩阵) 能够解决没有负权边的单源最短路径dijkstra算法的优先队列优化(邻接矩阵)。dijkstra算法的优先队列优化(邻接表)dijkstra算法的堆优化(邻接矩阵)bellman-ford算法(邻接矩阵) 能够解决负权边的单源最短路径bellman-ford...原创 2018-05-10 19:25:13 · 1812 阅读 · 0 评论 -
单链表的删除---在链表中删除值为x的元素 和 往链表中i位置插入一个数x的操作
单链表的删除:通过图来看思路p指针用来找链表中数字为x的位置,pre指针始终指向p指针所指向位置的前一个位置最好自己在纸上模拟一下代码:#include<bits/stdc++.h>using namespace std;typedef struct Node{ int value; struct Node *next;}node,*l...原创 2018-05-07 19:25:04 · 6093 阅读 · 0 评论 -
单链表建立的两种方法 头插法和尾插法
目录:方法1:头插法方法2:尾插法方法1:头插法基本思路:定义一个链表类型的指针l,指针l指向的是链表的首地址,而不是链表的第一个数,指针l指向的下一个链表类型才是链表的第一个数,每次往链表中加数都加到链表中的第1个位置(即指针l指向的位置)。代码:最好自己看代码在纸上模拟一下过程#include<bits/stdc++.h>using name...原创 2018-05-06 18:22:06 · 21089 阅读 · 6 评论 -
判断回文的三种方式
首先,先介绍一下什么是回文:这就是回文,简单来说就是前后对称目录:第一种方法:第二种方法:第三种方法: 第一种方法:就是将这串数字逆序,然后判断逆序后的数字是否和正序后的数字完全一样,如果完全一样,就是回文。那么,如何将这串数字逆序:就是利用一个栈来实现逆序。 利用栈先进后出的性质。代码如下:#include<bits/stdc++.h...原创 2018-05-06 13:47:30 · 50116 阅读 · 3 评论