Given a m * n
matrix mat
and an integer K
, return a matrix answer
where each answer[i][j]
is the sum of all elements mat[r][c]
for i - K <= r <= i + K, j - K <= c <= j + K
, and (r, c)
is a valid position in the matrix.
Example 1:
Input: mat = [[1,2,3],[4,5,6],[7,8,9]], K = 1
Output: [[12,21,16],[27,45,33],[24,39,28]]
Example 2:
Input: mat = [[1,2,3],[4,5,6],[7,8,9]], K = 2
Output: [[45,45,45],[45,45,45],[45,45,45]]
思路:这题其实考点就是个prefixSum,Sum[i..j] = PrefixSum[j] - PrefixSum[i-1],注意这里是i - 1;
// 这个点是i - k + 1的上面一个点,根据prefixSum 定义
// Sum[i, j] = PrefixSum[j] - PrefixSum[i-1];
// i - 1,也就是这个点;所以这里r1, c1没有+1;
r1 c1
r2 c2
r1, c1 的点,其实是区域范围 (i - k + 1, j - k + 1)的上一个点;
class Solution {
public int[][] matrixBlockSum(int[][] mat, int k) {
if(mat == null || mat.length == 0 || mat[0].length == 0) {
return mat;
}
int m = mat.length;
int n = mat[0].length;
int[][] prefixSum = new int[m + 1][n + 1];
for(int i = 0; i <= m; i++) {
for(int j = 0; j <= n; j++) {
if(i == 0 || j == 0) {
prefixSum[i][j] = 0;
} else {
prefixSum[i][j] = prefixSum[i - 1][j] + prefixSum[i][j - 1] - prefixSum[i - 1][j - 1]
+ mat[i - 1][j - 1];
}
}
}
int[][] res = new int[m][n];
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
int r1 = Math.max(0, i - k);
int c1 = Math.max(0, j - k);
int r2 = Math.min(m, i + k + 1);
int c2 = Math.min(n, j + k + 1);
res[i][j] = prefixSum[r2][c2] - prefixSum[r1][c2] - prefixSum[r2][c1] + prefixSum[r1][c1];
}
}
return res;
}
}