LeetCode 1314.矩阵区域和
给你一个 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:
vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int K) {
int n = mat.size();
int m = mat[0].size();
vector<vector<int>> dp(n + 1, vector<int>(m + 1)); //防止越界加个1
vector<vector<int>> res(n, vector<int>(m));
//计算区域面积
for(int i = 0; i < n; i++){
for(int j = 0; j < m; 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 < n; i++){
for(int j = 0; j < m; j++){
//保证x1、x2、y1、y2在矩形范围内
int x1 = max(i - K, 0);//这里不加1是因为要保留i-k区域的值,如果加1就减去了i-k的值
int x2 = min(i + K + 1, n);
int y1 = max(j - K, 0);
int y2 = min(j + K + 1, m);
res[i][j] = dp[x2][y2] - dp[x1][y2] - dp[x2][y1] + dp[x1][y1];
}
}
return res;
}
};