{//定义一个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]。通过差分...
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];}...
设原数组为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....
差分数组详解[通俗易懂] 大家好,又见面了,我是你们的朋友全栈君。 题目: 来先看一道裸题,有n个数。 m个操作,每一次操作,将x~y区间的所有数增加z; 最后有q个询问,每一次询问求出x~y的区间和。 思路: 很明显,直接用前缀和无法快速满足这个操作,所以我们就用到了查分数组。
publicclassDifference{// 差分数组privateint[]diff;publicDifference(int[]nums){diff=newint[nums.length];diff[0]=nums[0];for(inti=1;i<diff.length;i++){diff[i]=nums[i]-nums[i-1];}}/** * 给区间[i,j],增加val(可为负数) *
时间复杂度:O(n + m),n是差分数组的长度,m是操作的次数。对于每一次操作都要处理一次差分数组,并最后对差分数组求前缀和。 空间复杂度:O(1),注意返回值不计入空间复杂度。 代码 classSolution{int[]getModifiedArray(intlength,int[][]updates){int[]diff=newint[length];for(int[]u:updates){diff[u[0...
原数组前n+1项和== 差分数组第i项值*(n-i+1)逐项累加 \( \sum_{i=0}^{n}O[i] = \sum_{i=0}^n\sum_{j=0}^iD[i] \) => \( \sum_{i=0}^nO[i] = D[0] + (D[0] + D[1]) + ...+ (D[0] + D[1] + ... + D[n]) \) ...
频繁对数组的一段区间进行增加或减去同一个值,如果一个个去操作,很明显效率很差,我们可以使用差分数组,差分数组就是原始数组相邻元素之间的差。定义差分数组 d[n] ,我们可以得到: d[i] = nums[i] − nums[i−1] ,其中 d[0] = nums[0] ,如下图所示。 我们可以看到原数组就是差分数组的前缀和。
时间复杂度:O(n + m),n是差分数组的长度,m是操作的次数。对于每一次操作都要处理一次差分数组,并最后对差分数组求前缀和。 空间复杂度:O(1),注意返回值不计入空间复杂度。 代码 class Solution { int[] getModifiedArray(int length, int[][] updates) { ...