给你一个 m * 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]]
通过计算矩阵的前缀和,每一个要求计算的矩阵区域,都可以通过矩阵的前缀和组合得到
代码
class Solution {public int[][] matrixBlockSum(int[][] mat, int K) {int n=mat.length,m=mat[0].length;int[][] dp=new int[n+1][m+1];int[][] res=new int[n][m];for(int i=1;i<=n;i++)for(int j=1;j<=m;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<=n;i++)for(int j=1;j<=m;j++){int left= Math.max(j-K-1,0);//确定边界int right= Math.min(j+K,m);int up= Math.max(i-K-1,0);int down= Math.min(n,i+K);res[i-1][j-1]=dp[down][right]-dp[up][right]-dp[down][left]+dp[up][left];//通过前缀和的组合,得出区域和}return res;}
}