1314. Matrix Block Sum
Difficulty: Medium
Related Topics: Dynamic Programming
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]]
Constraints:
m == mat.length
n == mat[i].length
1 <= m, n, K <= 100
1 <= mat[i][j] <= 100
Solution
Language: Java
Key: 建立prefix sum matrix的时候,一定要注意哪些在点上面,哪些在方块里面
class Solution {
public int[][] matrixBlockSum(int[][] mat, int K) {
int[][] dp = new int[mat.length + 1][mat[0].length + 1];
int[][] result = new int[mat.length][mat[0].length];
for (int i = 0; i < mat.length + 1; i++){
dp[i][0] = 0;
}
for (int j = 0; j < mat[0].length + 1; j++) {
dp[0][j] = 0;
}
for (int i = 1; i < mat.length + 1; i++) {
for (int j = 1; j < mat[0].length + 1; j++) {
dp[i][j] = dp[i][j - 1] + dp[i - 1][j] - dp[i - 1][j - 1] + mat[i - 1][j - 1];
}
}
for (int i = 0; i < mat.length; i++) {
for (int j = 0; j < mat[0].length; j++) {
int x1 = Math.max(i - K, 0);
int y1 = Math.max(j - K, 0);
int x2 = Math.min(i + K + 1, mat.length);
int y2 = Math.min(j + K + 1, mat[0].length);
result[i][j] = dp[x2][y2] - dp[x1][y2] - dp[x2][y1] + dp[x1][y1];
}
}
return result;
}
}