题目描述:
给你一个 m * n 的矩阵 mat 和一个整数 K ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和:
i - K <= r <= i + K, j - K <= c <= j + K
(r, c) 在矩阵内。
思路分析:
1.dp[i][j]存储的是mat[0][0]到mat[i][j]的总和;
2.res存储的是矩阵和,确定矩阵的最左上角位置和右下角位置
3.如图,很轻松算出红色区域的和
class Solution {
public int[][] matrixBlockSum(int[][] mat, int K) {
int rlen=mat.length;
int clen=mat[0].length;
int[][]dp=new int[rlen+1][clen+1];
int[][]res=new int[rlen][clen];
for(int i=1;i<=rlen;i++){
for(int j=1;j<=clen;j++){
dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+mat[i-1][j-1];
}
}
for(int i=1;i<=rlen;i++){
for(int j=1;j<=clen;j++){
int x0=Math.max(0,i-K-1);
int y0=Math.max(0,j-K-1);
int x1=Math.min(rlen,i+K);
int y1=Math.min(clen,j+K);
res[i-1][j-1]=dp[x0][y0]+dp[x1][y1]-dp[x0][y1]-dp[x1][y0];
}
}
return res;
}
}