- 博客(7)
- 收藏
- 关注
原创 前缀和 --- 一维与二维 (C ++ 详细图解)
一、 一维前缀和原理给定一个 a 数组,请求出它的前缀和数组 s :那么 a 数组的前缀和数组为:a 数组与 s 数组之间满足:s[ i ] = a[ 0 ] + a[ 1 ] + a[ 2 ] + … + a[ i ]但是,由于我们在计算前缀和时,为了更加方便,我们会将数组下标从 1 开始存入和读取。所以,我们的 s 前缀和数组为: s[ i ] = a[ 1 ] + a[ 2 ] + … + a[ i ]应用若是要求某个区间的和该怎么办?用以上的例子,我们想求 a 数组中下标从 3
2022-04-12 22:48:49 300
原创 高精度算法 --- 加法、减法、乘法和除法(C ++ 代码模板)
一、高精度算法(下文分别给出模板)原理:当一个数很大时,大到普通的 int 存不下时,可以考虑用数组来存储,即数组中一个位置存放一位。但是对于数组而言,一个数顺序存入数组后,对其相加减是很简单的。但是当要进位时,是相当麻烦的。因为要将整个数组全都往后移动一位,将最高位的进位位置空出来,这个操作是 O(n) 的。有一种方法可以很好的解决进位的问题。就是将这个数的个位数存至数组中的第一位(即 a[0]),最高位存入数组的最后一位(a[n - 1])。这样在处理进位时可以直接在数组的最后一位添加即可。在输
2022-04-10 23:34:47 674
原创 离散化处理区间和问题 --- 从原理到代码实现(C ++ 代码模板)
一、离散化的原理将给定的 n 个数根据相对位置映射至 0 ~ n - 1的一段新的数组中。具体的实现步骤:首先将需要离散化的值进行排序(C ++ 中有 sort 库函数,可以直接调用。若是想自己实现,这里给出介绍快排的传送门:快速排序–递归加双指针实现( c ++))将排序后的数进行去重查找离散化后的相对位置,利用二分查找(具体的二分查找在之前的博客中有介绍,这个是传送门:二分查找—从原理到代码实现(C ++ 详解))举个例子:离散化实现代码:vector<int> all
2022-04-09 22:50:44 233
原创 二分查找---从原理到代码实现(C ++ 详解)
1. 二分查找是什么?举个例子:在学校的体育上,老师让同学们严格按照高矮顺序进行排队。这时小明想知道自己在班里面的身高排第几?那么便数出小明是站在第几个就可以知道小明身高在班里面的排名。二分查找就是找到你在队伍中的位置的过程。2. 二分查找的原理:在一段有序数组q中,选取中间位置的数值q[middle],与所要查找的数值x比较大小,若是q[middle]大于x,那么将区间更新至left - middle。同理,小于的情况也可以得出为mid - right。最后即可得出所要求的数值在该有序数组的位置
2022-04-08 19:34:46 244
原创 归并排序---从原理到代码实现(C ++)
核心思想:分治与快速排序的核心思想一样,都是分治。不同之处在于快速排序是先进行具体操作再递归。归并排序则是先递归再进行具体操作。(快速排序具体操作可以看我的另一篇博客,有详细讲解。)快速排序--递归加双指针实现( c ++)即将给定的一段数组分为两段,分别出左右两端。(这一部分利用递归来对数进行排序)原理:利用递归分别将这组数分成左右两边,至递归最后,即左右两边都只剩一个数时,对其进行大小排序。以每次递归处理这段数左边为例:如上图:在第四次递归,只有两个数,这时我们将这.
2022-04-07 23:30:16 87
原创 快速排序--递归加双指针实现( c ++)
原理对于一段无序数组,如何实现快速排序?我们可以定义两个指针 i 和 j 来分别指向数组的左右两端,再定义一个值 x 来使得值 x 左边的数全都小于等于 x, 值 x 右边的数都大于等于 x。 这样我们再利用递归来分别对 x 的左右两端进行操作,即可实现整段数组的排序。实现---分三步第一步:确定 x先定义一个值 x,值 x 的定义我推荐用三数中值分割法。即在数组的首元素、中间元素和最后一个元素三者中选择中间值。这样的好处可以避免产生边界问题。举个例子:给定一个数组 q内含有的.
2022-04-06 23:14:31 876 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人