給你一個 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;}
}