{//定义一个ans用于记录结果,diff_array用作差分数组std::vector<int>ans(length,0); std::vector<int> diff_array(length+10);//让diff_array[0] = ans[0]就表示我们将ans[0],补在了差分数组的开头diff_array[0] = ans[0];//第一步先求一下差分数组,这题其实可以不写,因为初始的数组全是0for(...
差分数组在数学和计算机科学中有着广泛的应用,可以用来解决一些问题,如区间修改和查询问题、数列求和问题等。下面将介绍差分数组的原理和应用。 一、差分数组的原理 差分数组的原理很简单,就是用一个新的数组来保存原数组中相邻元素的差值。假设原数组为A,差分数组为B,那么B[i] = A[i] - A[i-1]。通过差分...
设原数组为a数组,差分数组为d数组,则对于i∈[2,n],都有d[i]=a[i]-a[i-1]. 三、差分数组的性质 1.当我们需要更新区间[l,r]时候(仅指加减运算),我们仅仅可以只更新d[l]+=x,d[r+1]-=x; 2.当我们需要单独查询原数组一个点的值的时候,我们不难发现出令 为d[i]的前缀和,那么a[i]= ; 3....
int[] res =newint[diff.length];// 通过差分数组得到结果数组res[0] = diff[0];for(inti =1; i < diff.length; ++i) {res[i] = res[i -1] + diff[i];}returnres;//---其实直接在diff上操作即可得到结果数组---for(inti =1; i < diff.length; ++i) {diff[i] += diff[i -1];}...
因此,今天的主角就出现了——差分数组。 算法原型 比如我们现在有一个数组arr,arr={0,2,5,4,9,7,10,0} 那么差分数组是什么呢?其实差分数组本质上也是一个数组,我们暂且定义差分数组为d,差分数组d的大小和原来arr数组大小一样,而且d[i]=arr[i]-arr[i-1](i≠0),且d[i]=0,它的含义是什么?就是原来...
频繁对数组的一段区间进行增加或减去同一个值,如果一个个去操作,很明显效率很差,我们可以使用差分数组,差分数组就是原始数组相邻元素之间的差。定义差分数组 d[n] ,我们可以得到: d[i] = nums[i] − nums[i−1] ,其中 d[0] = nums[0] ,如下图所示。 我们可以看到原数组就是差分数组的前缀和。
差分数组 写在前面 本部分内容借鉴于Young-children大佬对于差分数组的讲解,感谢大佬。 定义 差分数组类似于求解前缀和,给出原数组为d,差分数组为f,那么有f[i] = d[i] - d[i - 1],据此,可以发现两条差分数组的性质: d[i]等于f[i]的前缀和
1、差分数组的第 i 个数, 即为原数组的第 i-1 个元素和第 i 个元素的差值 2、当我们希望对原数组的某一个区间[l,r]施加一个增量inc时, 差分数组d对应的变化是:d[l] 增加inc,d[r+1] 减少inc 例如: 数组a = [1, 2, 3, 4, 5, 6] 对a[2] 到 a[4] 之间的所有数加上3,变为 a = ...
构造差分数组的用途:以空间换时间的高效 区间操作:在区间1~4上,所有数值都加上3;不需要遍历arr 1~4的范围,然后分别给每个值加上3,此时更改差分数组d即可。 差分数组d 在 2~4范围内的值都不用改变,只需改变差分数组 位置1 和位置 5的值即可,即,d[1] = d[1] + 3, d[5] = d[5] - 3;其余不...