- 博客(25)
- 收藏
- 关注
原创 算法笔记重点(19)深度优先搜索
具体DFS的概念书上已经解释得很详细,即以深度为关键词抱着不撞南墙不回头的精神搜索。由于DFS回溯的特点,我们利用递归去实现它。递归存在递归边界和递归式,递归边界即到头的情况,递归式则是向前搜索,可能存在多条路径。DFS需要大量刷题掌握,这里给出一个经典例子来体会DFS的思想。题目链接:问题F:走迷宫题目描述:有一个n×m格的迷宫(表示有n行、m列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这n×m个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个
2020-07-15 14:51:53
205
原创 算法笔记重点(18)大整数运算
比较方便的方法是先建立一个结构体存储大整数数组和它的长度。四则运算一般只设计高精度加法,高精度减法,高精与低精的乘法与高精与低精的除法,具体代码我之前有写,这里不赘述。对于高精度数比较,首先比较长度,长度相等则从高位向低位依次比较。...
2020-07-04 11:18:39
184
原创 算法笔记重点(17)质因子分解
质因子分解思路比较简单,首先建立一个结构体存储质因子以及其个数,由于十以内不同质因子乘积已经大于int范围,所以只需建立一个10个int的数组。然后打印素数表,并且只需打印到sqrt(n)即可。然后判断从2到sqrt(n)是否满足n%prime==0,如果满足,让n不断除以prime,直到n=1为止。如果遍历完n!=1,则使得n成为一个新的大于sqrt(n)的质因数。原理:n不存在大于sqrt(n)的质因数或只存在一个大于sqrt(n)的质因数。...
2020-07-04 11:01:49
487
原创 算法笔记重点(16)素数
素数的判断比较简单,判断2到sqrt(n)即可。素数筛取一般采用埃氏筛法。即默认全部为素数(哈希),从2开始,使得素数的倍数被筛掉,最后没有被筛掉的一定是素数。具体细节我在前面写过。
2020-07-04 10:56:14
3768
原创 算法笔记重点(15)分数
利用结构体存储分数的分母和分子分数的要求有三点:1.分母一定为正数 2.当分数为0时,分子为0,分母为1 3.分子与分母最大公约数为1 分数化简满足这三点即可分数的四则运算比较简单,按照常规运算即可,另外除法需要注意除数的分子是否为0,为0需要特判(输出inf或error)...
2020-07-04 10:53:12
256
原创 算法笔记重点(14)最大公约数与最小公倍数
以gcd(a,b)=gcd(b,a%b)为递归式,gcd(a,0)=a为递归边界我们可以得到a,b的最大公约数。最小公倍数即为a*b/gcd(a,b)。对于多个数的最小公倍数,可以用两个数的最小公倍数和另一个数继续求出最小公倍数,以此类推。...
2020-07-04 10:48:28
168
原创 算法笔记(13)随机选择算法
例:求第k大的数利用Partition操作随机选择一个数并产生划分,判断该数是不是第K大的数,如果偏小则在右边继续划分,偏大则在左边继续划分,直到找到第K大的数或者达到边界为止。其中的Partition操作随机选取一个数,这种算法的复杂度为O(n),比排序的O(nlogn)快。...
2020-07-03 15:31:26
144
原创 算法笔记重点(12)two pointers
two pointers 利用问题本身特点以及序列的特性,使用两个下标扫描从而快速解决问题。two pointers可以同向也可以反向。例如求在一个没有相同元素的序列中任取两个元素和为M的方式有多少种。这个时候如果直接遍历,那么需要两个循环,即复杂度为O(n2)。如果我们将序列排序,利用i,j反向扫描,则复杂度仅为O(n)。另外,当我们在归并排序时,merge也采用的是同向扫描,快速排序中则采用的是反向扫描,这些排序的优越性也体现了two pointers的强大。...
2020-07-03 14:45:16
138
原创 算法笔记重点(11)二分
学会二分应当掌握三种模板,即寻找相等的值,寻找第一个大于等于的值以及寻找第一个大于的值,大于等于的值与大于的值可组成一个左闭右开的存在性区间,找到多个相同的值。另外,初值的选取需要看返回的值范围。浮点数二分也很重要,这里需要设置精度,当right-left<eps即可退出,返回mid。此外还有二分答案,即侧重应用,比如装水问题和木棒切割问题。快速幂非常实用,我们利用递归的思想,根据当b为奇数时,ab=a*ab-1,当b为偶数时ab=ab/2*ab/2,递归边界为a0=1。当然也可以用迭代的思想,
2020-07-01 15:49:00
118
原创 算法笔记重点(10)区间贪心
区间不相交或者区间选点问题是一类典型的问题。方法也很固定,一种是按左端点从大到小排序,左端点相同按右端点从小到大排序,这样每个区间的右端点小于上个选中区间的左端点即为符合要求的区间。另一种则是右端点从小到大,同理。...
2020-07-01 15:36:59
192
原创 算法笔记重点(9)递归
将原问题划分成若干个规模较小而结构与原问题相同或相似的子问题,然后分别解决这些子问题,最后合并子问题的解,得到原问题的解的方法,广义上讲称为分治。严格意义上,子问题数为1的情况称为减治,大于1的情况称为分治。而分治既可以通过递归实现,也可通过非递归实现,递归只是实现分治的一种手段。递归的两个关键是递归边界和递归式。阶乘运算和Fibonacci数列分别是减治和分治的典型例子下面给出一个求全排列的递归函数bool hashtable[maxn]={false};int p[maxn]void ca
2020-06-30 09:00:42
134
原创 算法笔记(8)哈希
在M个数中查找某个数是否出现过,或者在一篇文章中查找一个单词是否出现过,又或者需要统计一篇文章中某个单词出现的次数,最直接的思维就是依据这个单词遍历整篇文章。显然,这种算法的时间复杂度随着文章篇幅的增多时间逐渐增加,那么如何写出一个常数级的查找算法呢?哈希帮我们解决了这类问题。简单的,对于整数查找,我们可以利用bool数组以空间换时间的方式,统计次数则换用int类型即可。那么,问题来了。对于过大的整数,单纯靠消耗空间显得极不明智。所以我们采取了散列函数,将一个较大的整数浓缩为一个唯一的小整数(即H(ke
2020-06-29 16:22:42
144
原创 算法笔记重点(7)排序
排序总会放在任何算法教材的首要部分,这里不写出选择排序,插入排序,冒泡排序,归并排序,快速排序等详细代码,我之前有写过。而又由于C语言的qsort()函数对指针要求较高,所以着重分析C++的sort()函数应用。对待基本数据类型的数组,sort()非常容易搞定,并且默认情况下由小到大排序,那么重点应该就是结构体了。我们在模拟问题时经常需要模拟某个对象的特征,比如学生的姓名分数学号,将这些放入一个结构体再进行sort()。我们用到了cmp函数。bool cmp(T a, T b){ return
2020-06-28 22:18:43
91
原创 算法笔记重点(6)进制转换
这里想到进制转换是为了之后的Hash学习做准备。m进制转换为十进制#include<cstdio>#include<cmath>int main(){ int m,n,id=0; scanf("%d %d",&m,&n); for(int i=0;n>0;i++) { id=id+n%10*pow(m,i); n/=10; } printf("%d",id); r
2020-06-28 22:07:25
164
原创 算法笔记重点(5)黑盒测试
单点测试:PAT为典型例子,每一道题有若干次测试,每次测试都有相应的分数,所以正常情况下我们的程序执行一次即可,对输入输出要求相对较低。多点测试:codeup等多数OJ为典型例子,我们需要一次满足多对输入,并且每次输入需要返回相应的输出,所有输出正确才能得分,否则为0分。多点测试分为三类1.while…EOF型这种输入一般没有明确的结束条件,这要求在文件末尾前一直输入。我们需要用到scanf()的返回值,即在读取失败时返回的EOF(-1)。常见的代码结构是while(scanf(…)!=EOF){}
2020-06-27 20:26:55
205
原创 算法笔记重点(4)时间复杂度
对于敲代码的人,时间复杂度显得尤为重要。那么在理论上判断一个代码是否符合时间要求,应该认为一般的OJ一秒能承受的运算次数为107到108,我们面对一份代码首先估算其大O级别。例如一个O(n2)的复杂度的算法在规模为1000的条件下为106,尚可承受,而规模为100000时达到了1010的恐怖级别,所以在提交前我们心里要有个数,这代码能不能过。...
2020-06-27 20:17:11
378
原创 算法笔记重点(3)浮点数误差
经过一系列计算后的浮点数会发生细小的改变,这将导致==不再适用,下面给出新的解决方案。令eps=1e-8声明浮点数a,b1.相等条件|a-b|<eps2.大于条件a>b+eps3.小于条件a<b-eps4.大于等于条件a>b-eps5.小于等于条件a<b+eps综上,我们认为误差绝对值在eps之内是相等的,那么小于和大于的范围就相应的缩减了。除此之外,我们对pi的定义可以用acos(-1),以达到精准的目的。...
2020-06-27 20:11:10
172
原创 算法笔记重点(2)sscanf与sprintf的应用
曾经为将整数或浮点数与字符串转化而头疼,现在有了很好的工具。在此之前首先看看stringstream的用法,这个适用于string容器。#include<iostream>#include<string>#include<sstream>using namespace std;int main(){ string s; double a; cin>>a; stringstream st; st<<
2020-06-27 20:03:39
100
原创 算法笔记重点(1)浮点数的四舍五入
浮点数在以下几种情况采用四舍五入1.printf("%.mf",a);2.cout<<fixed<<setprecision(m)<<a<<endl;3.利用cmath的round()函数,对浮点数四舍五入取整4.利用强制类型转换的功能,即类似于a=(int)(b+0.5)对b四舍五入。5.利用floor()与ceil()函数,采用类似4的技巧对其四舍五入。注意:如需对小数点后若干位取整,则在3,4,5中需要对浮点数进行乘法处理,完成后再还原即可。
2020-06-27 19:53:30
1246
原创 基础快读(新手入门)(C++实现)
作为一名蒟蒻,从刚开始接触到scanf与printf,再转到cin与cout,后来又发现后者不如前者的速度快,于是又投回了C的怀抱,或者输入一段取消同步的代码std::ios::sync_with_stdio(false);每一次的进步都意味着更灵活的处理,于是又产生了比前两者都快的快读算法,利用getchar()函数处理大量输入数据,从而有效降低了时间复杂度,这里只涉及int和double...
2020-04-06 10:08:13
879
原创 一些简单实用的STL(新手入门)
对于我这样的蒟蒻来说,STL半生不熟,算法和数据结构更是一窍不通,这个时候就需要一些实用的STL函数来解决一些问题,注意这里不会详细列出参数或者模板,只是保证会用即可附上详细链接:C++ reference一.min,max函数不用细说,最常用的函数,不用手写了,拥有algorithm头文件都搞定,比较两数大小,除此之外可以比较string,char,double等,但是不能跨数据类型比较...
2020-04-05 19:50:43
486
原创 初学者必会的几种简单排序(新手入门)(C++)
这里介绍几种简单排序,是我身为初学者的一种总结和归纳,如有不足,希望路过的大佬指出一.计数排序计数排序是特殊的排序,它不需要比较,以空间换时间的代价换来了高效,但同时也有局限性,首先不能对负数排序,其次对较大的数无能为力,浪费了大量空间,代码如下:#include<iostream>#include<algorithm>#include<cstring>...
2020-03-31 21:35:49
280
原创 总结几个比较常用的数学公式(新手入门)
合理的公式可以帮助我们优化代码,比如可以减少遍历的次数,减少思考的难度,提高算法效率,此文章将持续更新一.换底公式Logab=logxb/logxa换底公式虽然不常用,但是我觉得还是不可缺少的知识点二.海伦公式S=sqrt(p(p-a)(p-b)(p-c)),其中p=(a+b+c)/2.海伦公式是通过边长求三角形不可缺少的公式三.求位数求某个数的位数需要用到某些公式,因为这个数可能...
2020-03-30 19:26:10
2637
原创 大数与高精度的一系列计算(C++)(新手入门)
高精度算法是模拟思想中比较典型的部分,这里列举了一些典型的我个人总结的精度算法(新手入门),一些基本的概念大家可以自己百度查阅注意这里进行运算的数据都是非负数,但是结果不一定是非负数1.高精加低精这里是用一个大数依次加若干个小数,即从90001加到95000共5000次加法,注意这里没有采用输入,如果要用数组存储位数,须用到sstream头文件,将int类型转换为string类型//大数加...
2020-03-21 11:54:34
1242
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人