题目描述:
给你一个 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]]
示例 2:
输入:mat = [[1,2,3],[4,5,6],[7,8,9]], K = 2
输出:[[45,45,45],[45,45,45],[45,45,45]]
提示:
m == mat.length
n == mat[i].length
1 <= m, n, K <= 100
1 <= mat[i][j] <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/matrix-block-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
使用硬方法
class Solution {
public int[][] matrixBlockSum(int[][] mat, int K) {
int m = mat.length;
int n = mat[0].length;
int [][]result = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
result[i][j] = get(mat,i,j,K);
}
}
return result;
}
public int get(int [][]mat,int x,int y,int k){
// 四个方向
int result = 0;
int left = y - k >= 0 ? y - k : 0;
int up = x - k >= 0 ? x - k : 0;
int right = y + k < mat[0].length ? y + k : mat[0].length - 1;
int down = x + k < mat.length ? x + k : mat.length - 1;
for (int i = up; i <= down; i++) {
for (int j = left; j <= right; j++) {
result += mat[i][j];
}
}
return result;
}
}
看看别人实现的方法
使用前缀和
public int[][] matrixBlockSum(int[][] mat, int K) {
int row = mat.length;
int col = mat[0].length;
int[][] res = new int[row][col];
int[][] dp = new int[row + 1][col + 1];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
dp[i + 1][j + 1] = dp[i][j + 1] + dp[i + 1][j] - dp[i][j] + mat[i][j];
}
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
// 左上角坐标
int r1 = Math.max(i - K, 0);
int c1 = Math.max(j - K, 0);
// 右下角坐标
int r2 = Math.min(i + K, row - 1);
int c2 = Math.min(j + K, col - 1);
res[i][j] = dp[r2 + 1][c2 + 1] - dp[r1][c2 + 1] - dp[r2 + 1][c1] + dp[r1][c1];
}
}
return res;
}