算法学习
文章平均质量分 67
无所畏惧的man
不做下一个谁,只做第一个我!
展开
-
滑动窗口算法总结
前言我是会写Bug的子晗,生命不止,算法永不息!昨天晚上,闲来无事去学校acm队训练机房呆了一会,太受刺激了,大一的把我摁在地上摩擦,属实很拉,学习了一个滑动窗口算法。唉,现在算法刚开课,之前自己也学过一段时间,但刷体很少。以后晚上得经常去跟着他们一起去训练了,这种行为我愿称之为“偷学"。(手动滑稽)算法思想我个人觉得滑动窗口算法思想与双指针相似,模拟一个窗口,创建的窗口逐渐滑动,根据题目给定的限制条件,来更新窗口边界,从而不断的更新题目所需值,当窗口滑动至边界时,这时也意味着,算法结束,即可原创 2021-03-11 14:41:02 · 482 阅读 · 1 评论 -
n!的特定质因子个数问题
n!问题给定一个数的阶乘,让你求有多少个质因子p。常规算法直接枚举n的阶乘的数,然后求出每一数所含有的质因子p,然后相加即可int cal(int n,int p)//常规算法{ int counts=0; for(int i=2;i<=n;i++) { int temp=i; while(temp%p==0) { counts++; temp/=p; }原创 2020-07-29 19:25:37 · 451 阅读 · 0 评论 -
练车加端盘子也挡不住我学习系列——大整数运算
大整数运算典型的A+B问题在不少学校的ACM题库里,都会有一道A+B问题,我记得杭电ACM题库里第一道就是A+B problem,当时就是感觉不就是输入两个整数,然后输出相加结果不就AC了吗!可就是一直通过不了,通过今天的学习,我终于认识到我当初错到哪了!你能保证这个整数不是一个很大的整数吗?假如它是个1000位的整数呢,这时候基本数据类型已经无法进行存储了,这时候我们就要模拟加法运算,自己设计算法来解决问题!高精度加法算法思路:储存结构:我们可以用一个结构体来存储,并用构造函数对数据进行初始化原创 2020-07-28 22:19:09 · 160 阅读 · 0 评论 -
练车加端盘子也挡不住我学习——质因子分解问题
质因子分解质因子分解即为将一个正整数分解为数个质因子相乘的形式。如6=2*3。算法思路要想分解一个正整数,首先我们当然是要先获取素数表分析可得,这个数分解方式就有两种全部为小于等于sqrt(x)的质因数一个大于sqrt的质因数和几个小于sqrt(x)的质因数我们可以用一个结构体来储存每个质因数和他的个数,方便表示。struct factor{ int x,cnt;//质数及个数}【PAT A1059】Prime FactorsGiven any positive i原创 2020-07-27 16:50:43 · 144 阅读 · 0 评论 -
练车加端盘子也挡不住我学习系列——埃氏(Eratosthenes)筛法
素数表的获取普通算法依次枚举每个数,判断它是否为素数即可!此类算法较低效,复习度O(n)较大,并不实用。(以1到100为例)//普通类算法#include<iostream>using namespace std;int main(){ bool flag=true;//是素数 for(int i=2;i<100;i++) { for(int j=2;j<i;j++) { if(i%j==0原创 2020-07-25 20:08:51 · 153 阅读 · 0 评论 -
练车加端盘子也挡不住我学习系列——分数的四则运算
分数的四则运算分数结构struct Fraction{ int up,down;//分子,分母};分数的化简int gcd(int up,int down)//求最大公约数{ if(down==0) return up; else return gcd(down,up%down);}Fraction reduction(Fraction result)//分数的化简{ if(result.down<0)//分母小于0时 {原创 2020-07-24 10:49:59 · 146 阅读 · 0 评论 -
练车加端盘子也挡不住我学习系列——欧几里得算法求解最大公约数及最小公倍数
最大公约数问题正整数a和b的最大公约数是指正整数a和b所有公约数中最大的那个公约数。一般用gcd(a,b)来表示a和b的最大公约数,而求解最大公约数常用欧几里得算法(辗转相除法)。欧几里得算法证明:有a=kb+r,其中k和r分别为a除以b得到的商和余数。则有 r=a-kb成立。设d是a和b的一个公约数。那么可得r%d=a%d-kb%d,即可得d也是r的一个公约数。又因为r=a%b,则d为b和a%b的一个公约数由d的任意性可得,a和b的公约数都是b和a%b的公约数。同理也可证b和a%b的公原创 2020-07-23 11:23:24 · 311 阅读 · 0 评论 -
练车加端盘子也挡不住我学习系列——数字黑洞问题
【PAT B1019/A1069】数字黑洞题目描述给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174,这个神奇的数字也叫 Kaprekar 常数。例如,我们从6767开始,将得到7766 - 6677 = 10899810 - 0189 = 96219621 - 1269 = 83528532 - 2358 = 6174764原创 2020-07-22 11:57:19 · 179 阅读 · 0 评论 -
练车加端盘子也挡不住我学习系列——随机选择算法
废话不多说,直接步入正题!随机问题如何从一个无序的数组中求出第K大的数?常规思想直接选择排序从小到大,然后直接找出第K个数即可。时间复杂度为O(n^2)。总的来说,这不是一个很好的算法!随机选择算法随机选择算法的原理类似于随机快速排序算法。当对A[left,right]执行一次randPartition函数之后,主元左侧的元素个数就是确定的,且它们都小于主元。假设此时主元是A[p],那么A[p]就是A[left,right]中的第一个p-left+1大的数。不妨令M表示p-left+1,那么如果原创 2020-07-21 20:55:19 · 140 阅读 · 0 评论 -
练车加端盘子也挡不住我学习系列——算法技巧之巧妙的递推
铁汁们,我又来了!今天再次拿捏一把!雷霆嘎巴,无情拉少!什么是递推?有很多题目需要细心考虑过程中是否可能存在递推关系,如果能找到这样的递推关系,就能使时间复杂度降低不少,例如就一类序列问题来说,假如序列的每一位所需要计算的值都可以通过该位左右两侧的结果计算而得,那么就可以考虑所谓的“左右两侧的结果”是否能通过递推进行预处理来得到,这样在后面的使用中就可以不必反复求解。有几个PAT问题问题描述字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),原创 2020-07-20 20:39:45 · 269 阅读 · 0 评论 -
练车加端盘子也挡不住我学习系列——快速排序算法
铁汁们,今天拿捏了啊,练车时一会就看懂了快速排序算法。什么是快速排序?快速排序(Quick Sort)是对冒泡排序的一种改进,它是排序算法基本思想是选取一个记录作为枢轴,经过一趟排序,将整段序列分为两个部分,其中一部分的值都小于枢轴,另一部分都大于枢轴。然后继续对这两部分继续进行排序,从而使整个序列达到有序。 它是不稳定的。由C. A. R. Hoare在1962年提出的一种划分交换排序,采用的是分治策略(一般与递归结合使用),以减少排序过程中的比较次数,它的最好情况为O(nlogn),最坏情况为O(原创 2020-07-19 13:30:19 · 183 阅读 · 0 评论 -
练车加端盘子也挡不住我学习系列——归并排序算法
什么是归并排序?归并排序,是创建在归并操作上的一种有效的排序算法,效率为O(nlogn)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列,归并排序的比较次数小于快速排序的比较次数,移动次数一般多于快速排序的移动次数。你懂了吗?哈哈哈(手动滑稽~)经典案例我给你一个无序的数组,让你给我排序成从小到大的数组!你怎么排?选择排原创 2020-07-18 19:21:20 · 870 阅读 · 0 评论 -
练车加端盘子也挡不住我学习系列——two pointers算法思想
什么是two pointers?two pointers是算法编程中的一种非常重要的思想,但是很少会有教材单独拿出来讲解,它更倾向于一种编程技巧。其思想非常简洁,能够很好的降低程序的时间复杂度,它提供了非常高的算法效率。经典案例我给你一个递增的正整数序列a[n],让你找出序列中满足任意两个数a[i]和a[j]相加等于给定的数值M的数组元素,即a[i]+a[j]=M。你可能会说:我丢!这玩意太简单了,直接双循环枚举不就完事了。下面这个算法是我们的直观思维。for(int i=0;i<n-1原创 2020-07-17 18:57:54 · 197 阅读 · 0 评论 -
WarShall算法求矩阵传递闭包关系
离散知识给了你一个矩阵,你如何求他的传递闭包呢?//求出如下矩阵的传递闭包1 0 1 0 01 1 1 0 00 0 0 0 11 0 0 1 00 0 0 0 0利用WarShall算法求解过程如下:从第一列元素,开始看,哪个为1,可以看出,<1,1>,<2,1>,<4,1>为1,则分别将第1、2、4行元素与第1行元素进行逻辑加,成为新的1、2、4行的元素。1 0 1 0 01 1 1 0 00 0 0 0 11 0 1 1 00 0 0原创 2020-06-15 22:19:13 · 4429 阅读 · 4 评论 -
算法笔记——一张A4纸让你看懂递归全排列
唉,这个问题我想了一天半,一直没想通,哈啊哈哈哈。今天动手画了画图,把程序走了一遍,才搞出来,但对于递归还是不太理解,这个算法,最好画一遍图,自己走一遍。要不然真的容易绕进去。本人是一个菜鸡,之前参加学校的ACM纳新赛惨遭淘汰,现在自学算法,唉,给自己加加油,说不定我就是下一个大佬呢,人可以不强大,但一定要有梦想,梦想看起来很扯淡,不扯淡那还叫梦想???(手动滑稽~)全排列指的是n个整数的所有排列,按从小到大的顺序输出n个整数的全排列,其中(a1,a2,…ana1,a2,…an)的顺序小于(b1,b2原创 2020-05-21 21:30:38 · 466 阅读 · 1 评论 -
对算法复杂度的浅层讨论
斐波那契数列引发的思考第一种写法:#include<bits/stdc++.h>using namespace std;int fibs(int n) { if(n<=1) return 1; else return fibs(n-1)+fibs(n-2);}int main(){ int n; cin>>n; c...原创 2020-04-06 18:29:59 · 214 阅读 · 0 评论 -
算法笔记——对字符串hash的初步探讨
字符串hash初步探讨问题:学习了整数散列,知道了如何使用hash函数,将一个较大的整数映射为尽可能唯一的较小的整数。这在时间复杂度上有了很大的改进,但如果H(key)里面的key是一个字符换该怎么办呢?这时就要使用字符串hash,字符串hash是指将一个字符串S映射为一个整数,使得该字符串尽可能唯一的代表该字符串。#include<bits/stdc++.h>using ...原创 2020-03-29 10:19:34 · 180 阅读 · 1 评论 -
算法笔记——进制转换问题及【PAT B1022】D进制的A+B题解
进制转换问题经典问题:一个P进制的数如何转化为Q进制的数?P进制转换为十进制P进制的x为a1a2a3a4…an转换后:y=anP^0 +an-1P^1 +an-2P^2 +…a1P^n-1于是可得代码#include<bits/stdc++.h>//using namespace std;int Q_ten(int q,int Q) {//数值,进制 in...原创 2020-03-28 18:21:03 · 373 阅读 · 0 评论 -
算法笔记——散列定义及整型散列
散列的定义与整数散列散列是常用的算法思想之一,在很多程序中都能见到。经典问题:给出N个正整数,再给出M个正整数,问这M个数中的每个数分别在N个数中是否出现过。最直观的思路:对每个欲查询的正整数x,遍历所有N个数,看是否有一个数与x相等。这种做法的时间复杂度为O(MN),当M和N很大时,显然这种方法是不可取!#include<bits/stdc++.h>using namesp...原创 2020-03-27 22:58:21 · 229 阅读 · 0 评论 -
算法笔记——sort()函数及【PTA A1025】Ranking 的题解
sort()函数/*使用必须加入头文件#include<algorithm>*/sort(元素首地址(必填),尾元素地址的下一个地址(必填),cmp比较函数(非必填));/*没有cmp比较函数时,数据按递增输出*/cmp比较函数int型bool cmp(int a,int b){return a>b;}//此时按从大到小排列double型bool cmp(d...原创 2020-03-26 23:55:03 · 261 阅读 · 0 评论 -
算法笔记——冒泡排序,选择排序,插入排序
冒泡排序若一个数组储存n个元素,则要进行n-1趟排序,且每进行一次排序,最大(小)的数都会出现在右边。#include<bits/stdc++.h>using namespace std;int main(){ int a[5]={2,3,5,1,0}; for(int i=1;i<=4;i++)//n-1次排序 for(int j=0;...原创 2020-03-25 18:07:09 · 244 阅读 · 0 评论 -
算法笔记——二分查找
二分查找经典问题:如何在一个严格递增的序列A中找出给定的数x?最直接的方法就是:线性扫描序列中的所有元素,如果当前元素恰好为x,则表明查找成功,如果扫描完整个序列,也没有找到x,则表明查找失败这种顺序查找的时间复杂度为O(n),如果查询次数不多,是很好的选择,但如果需要查询的次数很多,这种方法就不太可行了,进行程序设计竞赛时,会出现运行超时。更好的办法就是使用二分查找二分查找是基于有序序列...原创 2020-03-21 23:24:58 · 232 阅读 · 0 评论 -
算法笔记——常用的math函数
C语言提供了很多实用的数学函数供我们使用,如果要使用他们,可以加上math.h头文件,下面来介绍几种我们常用的数学函数。fabs(double x)该函数用于对double型变量取绝对值#include<cstdio>#include<cmath>int main(){double a=-12.56;printf("%.2f\n",fabs(a));retu...原创 2020-03-19 18:42:42 · 300 阅读 · 0 评论