![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法模板或总结
文章平均质量分 76
Miiiiiiiiiii
这个作者很懒,什么都没留下…
展开
-
【经典算法】链表中的环
链表中的环一般有两个题,1个是判断是否有环,另外1个是找到环的入口。都是基于快慢指针的。大致思想就和名字一样,一个指针走的快,一个指针走的慢。链表中是否存在环给定一个链表,判断链表中是否存在环。Leetcode141环形链表例如:快慢指针快慢指针,慢指针每次走一步,快指针每次走两步,当两个指针相遇的时候,说明存在环。很简单,这就像操场跑圈一样,一个快,一个慢,最终快的会超越慢的相遇。为什么一定是快指针每次走两步呢?为什么不是三步,四步呢?这是因为慢指针每次走1步,快指针每次走2步,每走一原创 2021-01-18 00:49:34 · 629 阅读 · 0 评论 -
【经典算法】逆序对的数量
归并排序应用的经典题型,看该题之前请先看归并排序,附带链接:归并排序题目简述给定一个序列有n个数,求n个数中逆序对的个数,逆序对的定义:i < j && a[i] > a[j]。输入格式第一行包含一个整数n。第二行包含 n 个整数(所有整数均在1~1e9范围内),表示整数数列。输出格式输出一个整数,表示逆序对的个数。输入样例:62 3 4 5 6 1输出样例:5归并排序应用归并排序是将一个序列分成两个有序的序列,归并两个有序序列,归并后则该序原创 2020-11-24 10:23:14 · 12234 阅读 · 3 评论 -
【经典算法】第k小的数
快排应用的经典题型,看该题之前请先看快速排序,附带链接:快速排序题目简述给出n个数,找出n个数排序后第k个数,即找出第k小的数。输入格式第一行包含两个整数 n 和 k。第二行包含 n 个整数(所有整数均在1~109范围内),表示整数数列。输出格式输出一个整数,表示数列的第k小数。输入样例:5 32 4 1 5 3输出样例:3利用快速排序的性质该题是利用快速排序中的一个性质,即将主元放在正确的位置,使得左边的数都比主元小,右边的数比主元大,这样会产生一个性质:该数后面是不原创 2020-11-23 20:45:52 · 8943 阅读 · 2 评论 -
【算法模板】插入排序(超短)
简述插入排序算法:字面意思,每次插入之前,之前的序列都是有序的。应用:排序中最经典,必须掌握最坏情况时间复杂度O(N2),平均O(nlogn),空间复杂度O(logN)并且是不稳定的原创 2020-11-18 16:38:29 · 154 阅读 · 0 评论 -
【算法模板】二分查找(LeetCode不要太爽)
简述写这篇文章的时候,刷了LeetCode的二分题10-20题了,用起来真的很爽,可以说下面的模板绝大部分情况下都是基本不用想直接敲的。简直不要太爽,大概90%的情况下用总结的模板基本秒杀,%90是因为万事没有绝对…。二分题不难,只不过是各种情况的二分,边界情况处理不好,经常死循环或者答案错误等。二分主要还是需要刷一些题来感受比较深二分两个模板下面的模板中check函数是关于数组中mid指向的元素和x的关系的函数。我们每次只需要根据check函数来构思使用哪个模板。模板1该模板表示,我们c原创 2020-11-10 00:04:59 · 308 阅读 · 0 评论 -
【经典算法】BFS之Flood Fill
简述Flood Fill:字面理解,洪水填充,(大概意思是传播的很快,扩散的广,像水一样四处流动一样)。其实我感觉不就是个BFS嘛,感觉BFS起了个别的名字大致思想:中间一个点,向四周扩展,每次扩散一圈,下次再一圈…如此下去我们再想想我们数据结构学的BFS(广度优先遍历),这不是一回事嘛…再扩展到题,给人的感觉就是需要加判断,不是说每个点四周的所有点都可以Flood Fill池塘计数POJ2386来源: poj2386题意: 大致的意思是n*m的单元格,"."表示土地,"W"表示水,对于原创 2020-11-09 23:21:59 · 1065 阅读 · 0 评论 -
【算法模板】快速幂
简述快速幂:字面意思,快速求得ak,一般来说,由于该数可能很大,所以会让球ak % p。应用:数学相关的简单知识,基础快速幂的策略例如,如果我们要求6的11次幂,我们第一时间想到幂的本质就算k个数相乘,如图如果我们要计算1的整型最大值次方的话,即12147483647,这个时间复杂度就不言而喻了把,时间复杂度O(K)我们可以将幂次11看成一个2进制数进行展开。这样做的话,时间复杂度虽然还是和k有关,但是只是和k的二进制位数有关,时间复杂度O(logK)核心代码LL qmi(int a原创 2020-11-04 14:36:47 · 147 阅读 · 0 评论 -
【经典算法】n皇后问题(暴搜枚举剪枝)
n皇后问题也属于经典的回溯算法leetcode 51. N皇后n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。上图为 8 皇后问题的一种解法。给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。实例输入: 4输出:[[".Q…", // 解法 1“…Q”,“Q…”,“…Q.”],["…Q.", // 解法 2“Q…原创 2020-11-02 23:18:16 · 591 阅读 · 0 评论 -
【经典算法】全排列问题(暴搜枚举)
题目简述给定一个整数n,将数字1~n排成一排,按照字典序将所有的排列输出。输入格式共一行,包含一个整数n。输出格式按字典序输出所有排列方案,每个方案占一行。数据范围1≤n≤9输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1暴力枚举上图是递归树。我们要枚举,递归都可以画一棵树。当我们到最后一层时候,即该排列所有位都枚举完,填上数字了,就输出并返回。否则我们要枚举该排列的枚举的位上应该填什么数。经典的回溯算法,暴力枚举。 时间原创 2020-11-02 22:27:35 · 771 阅读 · 0 评论 -
【算法模板】欧几里得算法/辗转相除法(一行代码)
简述欧几里得算法:由欧几里得提出的,又称辗转相除算法,应用:快速求两个数的最大公约数时间复杂度O(logb)欧几里得算法除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数欧几里得算法模板int gcd(int a ,int b){ return b ? gcd(b , a % b) : a;}...原创 2020-11-01 22:51:24 · 299 阅读 · 0 评论 -
【算法模板】堆优化版Dijkstra最短路算法(超短)
简述Dijkstra算法:由Dijkstra提出的,基于贪心应用:单源最短路径问题并且权值不为负, 适用于稀疏图优化前:时间复杂度O(N2) , 空间复杂度O(N)优化后:时间复杂度O(MlogN) , 空间复杂度O(N) 空间是来存储1点到各个点的距离算法策略基于朴素版Dijkstra最短路算法.,将第一步在所有不确定的点中找到离1最短的点进行了优化,利用数据结构堆来优化。堆优化版Dikstra算法模板其中,下面的图是用邻接矩阵g来存储,dis[i]表示1点到i点的距离,st[i]表示i点原创 2020-11-01 22:38:39 · 131 阅读 · 0 评论 -
【算法模板】朴素版Dijkstra最短路算法(超短)
简述Dijkstra算法:由Dijkstra提出的,基于贪心应用:单源最短路径问题并且权值不为负, 适用于稀疏图时间复杂度O(N2) , 空间复杂度O(N)算法策略1.先从所有不确定的点中找到一个距离离1点最短的点。2.将该点确定。3.用该点去更新1点到其他点的距离Dikstra算法模板其中,dis[i]表示1点到i点的距离,st[i]表示i点是否已经确定。int dijkstra(){ //初始化 memset(dis, 0x3f ,sizeof dis); dis[原创 2020-11-01 22:22:51 · 154 阅读 · 0 评论 -
【算法模板】归并排序(超短)
简述归并排序算法:字面意思,归并两个有序的区间。基于分治思想应用:排序中最经典,必须掌握时间复杂度没有平均和最坏,每次归并排序时间复杂度都是O(NlogN),空间复杂度O(N) 因为要开额外的数组来保存归并的结果。归并排序的一般策略1.划分区间一分为二。2.先归并排序左区间,再归并排序右区间。3.左右两个区间都是有序的,采用二路归并法,归并到一个临时数组。4.将临时数组的值拷贝回原数组归并排序模板void merge_sort(int a[] , int l ,int r){ i原创 2020-11-01 22:07:36 · 815 阅读 · 0 评论 -
【算法模板】快速排序(超短)
简述快速排序算法:字面意思,一般情况下排序速度很快的排序,分治思想的应用:排序中最经典,必须掌握最坏情况时间复杂度O(N2),平均O(nlogn),空间复杂度O(logN)快排的一般策略1.每次从数组中选择一个主元(pivot)2.每次使得主元左边的数比主元小,主元右边的数比主元大3.分治处理主元左边,分治处理主元右边快排模板void quick_sort(int a[N], int l , int r){ if (l == r) return ; //选择主元 i原创 2020-11-01 21:58:57 · 1322 阅读 · 0 评论 -
【算法模板】高精度减法模板
简述高精度,字面意思理解,精度高,位数很多,一个数的位数可能是1e3甚至更高应用:手动模拟大整数的减法两个位数很大,位数可能达到1e3甚至更高的数减法运算直接存储无法存储,常规使用字符串或者数组来存储时间复杂度是O(max(M,N)),但是空间复杂度是2(M+N)。M和N分别是两个数的位数大小算法基本策略模拟两个数进行减法运算。高精度减法模板大整数的存储是低位在前面,高位在后面,即数组最前面表示的是个位,依次向后是十位,百…。下面的模板是保证a的位数>=b的位数,并且a>=b的原创 2020-11-01 21:42:04 · 295 阅读 · 0 评论 -
【算法模板】高精度加法模板
简述高精度,字面意思理解,精度高,位数很多,一个数的位数可能是1e3甚至更高应用:手动模拟大整数的加法两个位数很大,位数可能达到1e3甚至更高的数加法运算直接存储无法存储,常规使用字符串或者数组来存储时间复杂度是O(max(M,N)),但是空间复杂度是2(M+N)。M和N分别是两个数的位数大小算法基本策略模拟两个数进行加法运算。高精度加法模板考虑到进位问题,所以大整数的存储是低位在前面,高位在后面,即数组最前面表示的是个位,依次向后是十位,百…。vector<int> add原创 2020-11-01 21:29:51 · 387 阅读 · 0 评论 -
【算法模板】KMP算法
简述KMP算法:由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,串匹配算法,一般串都是指字符串。KMP是基于双指针算法的应用:一个字符串在另外一个字符串中出现的位置和 循环节一般地,被匹配的字符串叫主串,用来匹配主串的叫模式串如果我们不用KMP,来查找一个字符串在另外一个字符串中第一次出现的位置,暴力求解时间复杂度是O(NM),用KMP优化查询时间复杂度是O(1),但是空间复杂度是O(N)。M和N分别是模式串和字串的大小。KMP讲解我觉得MOOC浙江大学数据结构讲的很不错,原创 2020-11-01 21:17:17 · 381 阅读 · 0 评论 -
【算法模板】差分
简述差分。应用:来解决数组[l,r]区间中反复加一个数。如果我们不用差分,每次每次手动遍历给[l,r]之间的加上一个数的时间复杂度是O(N),用差分数组优化时间复杂度是O(1),但是空间复杂度是O(N)。差分和前缀和是逆运算我们给一个数组中[...原创 2020-10-31 18:21:32 · 224 阅读 · 0 评论 -
【算法模板】前缀和
简述前缀和,字面意思理解,串的前面连续一段的和。应用:用来解决多次查询数组中[l,r]区间的和。如果我们不用前缀和,但是多次都需要数组中某一段的和,每次求[l,r]之间的和的时间复杂度是O(N),用前缀和优化查询时间复杂度是O(1),但是空间复杂度是O(N)。计算机中很多算法思想都是用空间来换时间。高中的数列知识:可得下面的公式为了数组越界,和简化,我们a和s数组都用1来存储,就不需要特判i == 0的情况了查询[l,r]区间的和:s[r] - s[l - 1]证明:核心代码:原创 2020-10-31 11:37:01 · 233 阅读 · 0 评论 -
【算法模板】字符串类型非负整数转整型数字
字符串类型非负整数转整型数字,要保证字符串非负,否则需要加判断即可。int srtingToInt(string str){ int res = 0 ; for (int j = 0 ; j < str.size() ;j++){ res = res * 10 + str[j] - '0'; } return res;}以上代码可以推广成任意进制字符串转10进制例如:以下是16进制非负字符串转10进制,注意可能爆int,并且不适用与负数情况i原创 2020-10-23 10:10:43 · 190 阅读 · 0 评论