基础算法
文章平均质量分 56
新手刚开始学算法,可以先了解以下内容
不是颜
。。。
展开
-
高精度与高精度的乘法---基础算法
看到一个博主写得不错,我也照猫画虎:)原创 2023-10-11 10:42:41 · 105 阅读 · 0 评论 -
基础算法---区间合并
直接上题目,不废话!原创 2023-09-15 22:41:34 · 146 阅读 · 0 评论 -
双指针算法
所以j会将s[a[j]--],然后j++,循环到最后会把s[1]变为0,s[2]变为1(也就是将刚刚为1的s[]变成0,大于1的变成1)这时i==j,然后i再开始移动,目前s数组里只有s[2]等于1。i等于2时,会将s[2]++;其实我们之前就接触过双指针算法,在归并排序中,两个有序序列合并成一个更大的有序序列时,就有两个指针分别指向这两个有序序列。第二大类就是两个指针同时指向一个序列,例如在快排中,一开始就有一个指针指向了区间的开头,一个指针指向了区间的末尾。i等于1时,会将s[2]++;原创 2023-09-13 17:21:36 · 59 阅读 · 0 评论 -
前缀和思想
能够快速地求出原数组中某一段的和,预处理的时间复杂度是O(n),而对于每次查询时间复杂度是O(1),例如求原数组中 [l,r]区间中所有的数的和 也就是。,如果没有前缀和数组的话,就要循环一遍才可以求出结果,他的时间复杂度是O(n),如果有前缀和数组,那么只需要。就能得到区间和,那么为什么是l-1,很简单,例如我们要求[1,3]区间和,也就是。的求值都能够用到统一的公式 ,我们求前缀和的公式是。接下来再输入 m个询问,每个询问输入一对 l,r。,我们求[1,10]的区间和是。输入一个长度为 n的整数序列。原创 2023-09-10 20:23:49 · 64 阅读 · 0 评论 -
高精度加法[大整数运算]
如果使用C++内置的类型来存储大整数(位数有几万位),是会溢出的,得不到正确的值,即使是long long int类型的范围也只是[-9*10^19,9*10^19](无符号是[0,10^20]),所能存储的最大数字也就20位,所以需要高精度算法,高精度加法具体实现是模拟人对两个数相加的过程,个位加个位,十位加十位,百位加百位,满十要进位......原创 2023-09-09 23:08:19 · 45 阅读 · 0 评论 -
大整数乘法(基础算法)
分别是一个大整数A和小整数b相乘,两个都是正整数(1原创 2023-09-10 15:12:59 · 189 阅读 · 0 评论 -
二维差分---基础算法
a二维数组是b二维数组的前缀和数组,b二维数组是a二维数组的差分数组,也就是说a[i][j]=b[1][1]+b[1][2] + ......b[i][1] + b[i][2] + ...... b[i][j] ,下图是b的二维数组。b[x2+1][y2]减去C,那么图中青绿色的区域都会减去C,b[x1][y1+1]减去C,那么图中绿色区域都会减去C,很明显这样的操作会对红色区域减去两个C,所以b[x2+1][y2+1]加上C,那么红色区域都会加上C。每个操作都要将选中的子矩阵中的每个元素的值加上c。原创 2023-09-11 21:13:53 · 158 阅读 · 0 评论 -
二维前缀和
蓝色区间的面积减去红色区域的面积减去绿色区域的面积,这时发现黑色区域的面积被减了两遍,所以还要加一次黑色区域的面积, 这样就求出了 中间子矩阵的面积。输入一个n行m列的整数矩阵,再输入q个询问,每个询问包含四个整数×1,y1,×2,y2,表示一个子矩阵的左上角坐标和右下角坐标。接下来q行,每行包含四个整数×1,y1,×2,y2,表示一组询问。当我们需要求到某个矩阵的子矩阵的和时,就可以使用二维前缀和。------这一步要看清楚下标,的结果就可以了,如图。如果要 求中间的子矩阵的和,(x,y)为左上角。原创 2023-09-10 23:40:14 · 56 阅读 · 0 评论 -
高精度除法
这里也是一个高精度的整数除以一个低精度的整数,我们先来看人是如何相除两个数的,请看下图但是计算机不知道要从第二位开始除,所以不管如何就从第一位开始除,如下图我们可以知道是有余数的,这一过程可以公式化,例如第一位/b 就是商的第一位,第一位%b 就是第一位的余数,将第一位的余数*b加上下一位,第一位的余数*b加上下一位 /b就是商的第二位......以此类推,直到求完了被除数的最后一位。原创 2023-09-10 19:03:46 · 46 阅读 · 0 评论 -
一维的差分
就可以得到b数组,那么我们就称 b数组是a数组的差分 ,其实这个构造方法不需要记忆,只要你 能够写出。接下来输入m个操作,每个操作包含三个整数l, r, c,表示将序列中[l, r]之间的每个数加上c。如果没有差分,我们要让区间内的数都加上一个C,我们要遍历这个区间,时间复杂度是O(n)并且后面的所有 a都加上C,但是我们的要求的区间是 [l,r] ,那么还需要。开始,所以 最后a数组中 [l,r] 区间内的数都加上了一个C。接下来m行,每行包含三个整数l,r,c,表示一个操作。那么该如何构造b数组呢?原创 2023-09-11 20:18:24 · 86 阅读 · 0 评论 -
高精度减法[正整数]
这里讨论的大整数减法都是确保两个数都是正数,如果有负数,必然可以换算成两个数的绝对值的加法或者两个数的绝对值的减法,其次得保证A>=B,我们想想如果A原创 2023-09-10 11:25:19 · 83 阅读 · 0 评论 -
二分查找[浮点数二分]---非常轻松加愉快
由于浮点数的精度限制,边界可能会有一些微小的偏差,这会影响到二分查找的准确性。因此,在浮点数二分中,我们通常会设定一个足够小的误差范围作为终止条件,而不是直接使用精确的边界值(ps:由C知道提供)输出格式共一行,包含一个浮点数,表示问题的解。注意,结果保留6位小数。当题目要求是精度是10e-6时,为了让答案更为精确,可以把精度提高2,变成10e-8,如果不这样,在我们求27的3次方根会得到这个。mid,l,r不分情况是因为浮点数相加除以2的值在某个精度下是很准确的,可以让l和r的差值足够小来使误差减小。原创 2023-09-07 20:53:17 · 56 阅读 · 0 评论 -
二分查找[整数二分]
我们来看这题怎么样可以将二分的知识套进去呢,首先处理的这个问题是单调递增的,所以一定可以使用二分查找,题目要求我们找到一个数字(可能有多个,也可能没有)在数组中的起始位置和终止位置,那么可以查找第一个大于等于这个数的位置,查找第一个小于等于这个数的位置,一般来说这个就是他的起始和终止位置,但是有可能这个数在数组中不存在,所以还得判断这个数是否与数组[起始位置]或者数组[终止位置]相等,如果不相等,则说明数组中不存在这个数。那么二分的本质是什么呢?,那么l会更新成mid,而mid就是l,所以会死循环,原创 2023-09-07 20:02:27 · 109 阅读 · 1 评论 -
归并排序初体验
和快速排序的思想一样,归并排序也是采用分治的思想,利用递归实现.我们要将一个数组排序,如果数组的左半边是有序的,右半边也是有序的,那么只要遍历左/右半边,如果哪个元素小,就把这个元素"挑"出来,存到数组里,当遍历完,就可以合并成一个有序的数组.那么问题来了,怎么样将左半边的数组变成有序的呢,答:如果左半边的左半边和右半边是有序的,就可以利用刚刚的方法排序...这样无限细分,当得到区间内只有一个元素的时候,这区间中的元素绝对有序.原创 2023-09-06 21:09:38 · 26 阅读 · 0 评论 -
详解快速排序
如果x=q[l] or x=q[l+r>>1]此时只能用sort(l,j),sort(j+1,r);如果x=q[r] or x=q[l+r + 1>>1]此时只能用sort(l,i-1),sort(i,r);有时候基准值x采用区间内随机一个值,能够更好地完成工作。原创 2023-08-25 15:24:23 · 72 阅读 · 0 评论