算法笔记
文章平均质量分 76
记录代码小白的学习算法之旅
忧郁三角龙ଲ
这个作者很懒,什么都没留下…
展开
-
算法笔记之并查集
并查集并查集简介:应用举栗????:代码如下:应用变通????:代码如下:应用优化????:代码如下:并查集简介:并查集是一种用来合并不相交集合的算法,常用来检测一个图里面是否有环儿。应用举栗????:给出无向图的边,判断是否有环儿。①设无向图的边为{0,1},{1,2},{1,3},{2,4},{3,4},{2,5},如下图所示。②假设先选{0,1}这条边,设1是0的父节点。③再选{1,2}这条边,设1是2的父节点。④再选{3,4}这条边,设4是3的父节点。⑤再选{1,3}这条边原创 2021-02-17 18:35:07 · 132 阅读 · 0 评论 -
算法笔记之贪心(简单贪心&区间贪心)
贪心简单贪心:简单贪心算法简介:简单贪心应用举栗????:月饼组个最小数区间贪心算法简介:区间不相交问题:区间选点问题:区间贪心应用举栗????:区间不相交区间选点总结:简单贪心:简单贪心算法简介:贪心算法是求解一类最优化问题的算法,考虑在当前状态下局部最优(或较优)的策略,来使全局的结果达到最优(或较优)。要想获得最优结果,则要求中间的每步策略都是最优的。简单贪心应用举栗????:月饼题目描述月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、原创 2021-02-09 11:25:23 · 310 阅读 · 0 评论 -
算法笔记之素数判定与素数表
素数判定与素数表何为素数:素数判定:n未接近到int类型范围上界:若n接近到int类型范围上界:素数表的获取:1~n枚举(非筛法):1~n枚举(非筛法)代码实现:素数表的获取(1~n枚举非筛法)应用举栗????:素数筛法:素数筛法代码实现:素数表的获取(1素数筛法)应用举栗????:注意事项:何为素数:素数又称为质数,是指除了1和本身之外,不能被其他数整除的数。对给定的正整数n,如果对任意的正整数a(1<a<n),都有n%a!=0成立,就称n是素数;否则如果存在a(1<a<n),原创 2021-02-01 20:52:17 · 224 阅读 · 0 评论 -
算法笔记之快速排序
快速排序算法简介:快速排序的平均时间复杂度为O(nlogn), 其实现需要先解决这样的一个问题: 对一个序列A[1]、 A[2]、 … A[n], 调整序列中元素的位置,使得A[1] 左侧的所有元素都不超过A[1]、右侧的所有元素都大于A[1]。例如序列{5,3,9,6,4,1},调整序列中元素的位置,形成序列{3,1,4,5,9,6},让A[1]=5则左侧的所有元素都不超过它、右侧的所有元素都大于它。快速排序算法图解:给定序列A[1~11]= {35, 18, 16, 72, 24, 65, 12,原创 2021-02-01 11:20:11 · 165 阅读 · 0 评论 -
算法笔记之2-路归并排序
2-路归并排序算法简介:归并排序是一种基于“归并”思想的排序方法,最基本的是2-路归并排序。2-路归并排序的原理:将序列两两分组,将序列归并为[n/2]个组,组内单独排序,然后将这些组再两两归并,生成[n/4]个组,组内再单独排序,以此类推,直到只剩下一个组为止。归并排序的时间复杂度为O(nlogn)。2-路归并排序算法图解:将序列{66, 12, 33, 57, 64, 27, 18}进行2-路归并排序。①第一趟。两两分组,得到四组: {66, 12}、 {33,57}、 {64,27}、 {18原创 2021-01-31 15:43:58 · 3544 阅读 · 1 评论 -
算法笔记之直接插入排序
直接插入排序算法简介:直接插入排序是指,对序列A的n个元素A[1]~ A[n], (令i从2到n枚举,进行n-1趟操作。假设某一趟时,序列A的前i-1个元素A[1]~ A[i- 1]已经有序, 而范围[i, n]还未有序,那么这一趟就从范围[1,i- 1]中寻找某个位置j,使A[i插入位置j后范围[1,i]有序。直接插入排序算法图解:假设有一个序列A[1~6]= {5,2,4,6,3,1},共有六个元素,因此需要进行6-1=5趟操作。①第一趟:当前已有序部分为{5},需要把元素A[2] = 2插入已原创 2021-01-31 11:37:59 · 118 阅读 · 2 评论 -
算法笔记之简单选择排序
简单选择排序算法简介:简单选择排序是指,对一个序列A中的元素A[1]~ A[n], 令i从1到n枚举,进行n趟操作,每趟从待排序部分[i, n]中选择最小的元素,使其与待排序部分的第一个元素 A[i] 进行交换,在n趟操作后,所有元素就都是有序的。简单选择排序算法图解:因此简单选择排序总共需要进行n趟操作(1 ≤ i ≤ n),每趟操作选出待排序部分[i, n]中最小的元素,使其与 A[i] 交换。总复杂度为O(n^2)。简单选择排序算法代码实现:void selectSort(){ for(原创 2021-01-30 20:53:31 · 107 阅读 · 0 评论 -
算法笔记之快速幂
快速幂简介:快速幂基于二分的思想,常被称为二分幂。快速幂基于两个事实:①若b为奇数,则a^b = a * a^(b-1)。②若b为偶数,则a^b = a^(b/2) * a^(b/2)。问题引入:给定三个正整数a、b、m(a<10^9, b<10^6, 1<m<10^9 ),求a^b%m的值。typedef long long LL;LLpow(LL a, LL b, LL m){ LL ans = 1; for(int i = 0; i < b ; i++)原创 2021-01-30 10:40:47 · 137 阅读 · 0 评论 -
算法笔记之欧几里得算法&扩欧算法&乘法逆元
欧几里得算法:①欧几里得算法(辗转相除法)简介:欧几里得算法也称为辗转相除法,常用于求解最大公约数,一般用gcd(a,b)来表示a和b的最大公约数。若a、b均为正整数,则gcd(a,b) = gcd(b,a%b)。②欧几里得算法的代码实现:递归式:int gcd(int a,int b){ if(b == 0) return a;//递归边界 else return gcd(b,a % b);}简洁写法:int gcd(int a,int b){ return !b ?原创 2021-01-29 22:15:45 · 309 阅读 · 0 评论 -
算法笔记之KMP算法
KMP算法简介:主要针对字符串的匹配问题,给出字符串a和b,判断b是否为a的子串。时间复杂度为O(m+n) 由Knuth、Morris 和 Pratt 三位科学家共同发现。next数组简介:一个字符串s(下标从0开始)则以i号位作为结尾的子串即s[0…i]。对该子串来说,长度为k+1的前缀和后缀分别为s[0…k]和s[i-k…i]。定义next数组,next[i]表示使子串s[0…i]的前缀s[0…k]等于后缀s[i-k…i]的最大的k,若找不到相等的前后缀,则令next[i] = -1。即next[原创 2021-01-29 17:50:24 · 201 阅读 · 0 评论