1、什么是差分矩阵?
二维差分我们通常称之为差分矩阵。通过结合一维差分我们可以想到,它的作用是可以让某个子矩阵在O(1)的时间复杂度内让所有元素都加上c。
而我之前一直都在强调一点——前缀和与差分是逆运用,二维亦是如此。
如果我们有了一个b[][]如图:
很明显它的二维前缀和数组a[][]应该为:
两者的关系为——a 是 b 的 前 缀 和 数 组 , 而 b 是 a 的 差 分 数 组 ( 差 分 矩 阵 ) a是b的前缀和数组,而b是a的差分数组(差分矩阵)a是b的前缀和数组,而b是a的差分数组(差分矩阵)
2、差分矩阵的核心操作
我们前面已经提过,差分矩阵b[][]是帮助我们在O(1)时间内让原数组a[][]的某个子矩阵加上c。类似二维前缀和的讲解,通过图解能最快速帮忙大家理解差分矩阵的核心操作 :
1、首先我们有一个如图的数组a[][] ,我们想让红色板块的值都加上c
2、如果我们此时对数组b[][]的该点加上c
3、因为a[][]是b[][]的前缀和数组,根据二维前缀和的初始化出发,会使得a[][]以下子矩阵全部都加上c
4、很显然,增加的面积超出了我们想要的范围,所以我们还需要减去a[][]中这两个子矩阵的面积
5、又可以很明显的发现,减去的这两个子矩阵有重合的地方,我们多减了一次,最后还需要加回来,对于这两个减去子矩阵以及加回多减的操作。我们只需要让b[][]的绿色两点减上c,红色点加上c