【前缀和】矩阵区域和
文章目录
- 1314. 矩阵区域和
- 解题思路

1314. 矩阵区域和
1314. 矩阵区域和
给你一个 m x n
的矩阵 mat
和一个整数 k
,请你返回一个矩阵 answer
,其中每个 answer[i][j]
是所有满足下述条件的元素 mat[r][c]
的和:
i - k <= r <= i + k,
j - k <= c <= j + k
且(r, c)
在矩阵内。
示例 1:
输入:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 1
输出:[[12,21,16],[27,45,33],[24,39,28]]
示例 2:
输入:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 2
输出:[[45,45,45],[45,45,45],[45,45,45]]
提示:
m == mat.length
n == mat[i].length
1 <= m, n, k <= 100
1 <= mat[i][j] <= 100
解题思路
首先我们要明白题目要我们干什么,其实就是求出矩阵中每个元素,它向外拓展 k
个单位之后形成的区域的总和,如下图中以元素 4
为例,如果 k = 1
的话的情况:
那其实这道题我们就可以用之前学过的二维前缀和来解决,大体思路都是一样的,虽然我们给过模板,但是切记不要死记硬背,要理解模板是怎么来的!
下面的推导,统一使用以上图中元素 4
为中心,k=1
的例子来推导!
还是一样,首先我们需要一个二维的 dp
表来记录前缀和,而 dp[i][j]
就表示从 [0, 0]
到 [i, j]
的元素总和。
根据状态表示和区域的累加,可以得到 dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + mat[i][j]
,这个和模板题是类似的,这里就不细讲了!
接着我们再创建一个二维数组 ret
,用于记录每个位置的区域和作为函数返回值的,此时和二维前缀和模板题不同的是,我们这次要求的区间需要我们自己去求出来,其实也不难,只要求出了要求的区域的左上角和右下角两个坐标,就能得到这个区间的信息了,如下图所示:
也就是说,我们要求出图中的 x1
、y1
、x2
、y2
,但问题是,有可能这个区间的一部分是越界的,但是我们只要有效区间,所以我们需要做处理而不能单纯的让 x1 = 中心坐标 - k
这样子去计算,会出错的!
那么该如何灵活的计算这个可能越界的坐标情况呢❓❓❓
其实非常简单,首先假设中心元素 4
的坐标是 [i, j]
,然后做法如下所示:
以左上角为例,如果 i