- 矩阵区域和
给你一个 m x 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
吐槽一句力扣传参数组从零开始坑死我了, 写了那么多ifelse😫
class Solution {
public:
vector<vector<int>> matrixBlockSum(vector<vector<int>>& m, int k) {
int n = m.size(), mm = m[0].size();
vector<vector<int>> res(n, vector<int>(mm));
vector<vector<int>> s(n, vector<int>(mm));
for(int i = 0; i < n; i ++)
{
for(int j = 0; j < mm; j ++)
{
if(!i && !j)s[i][j] = m[i][j];
else if(!i)s[i][j] = s[i][j - 1];
else if(!j)s[i][j] = s[i - 1][j];
else s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
if(i || j)s[i][j] += m[i][j];
}
}
for(int i = 0; i < n; i ++)
{
for(int j = 0; j < mm; j ++)
{
int a = i + k, b = j + k;
if(a > n - 1)a = n - 1;
if(b > mm - 1)b = mm - 1;
int x = i - k, y = j - k;
if(x < 0)x = 0;
if(y < 0)y = 0;
if(!x && !y)res[i][j] = s[a][b];
else if(!x)res[i][j] = s[a][b] - s[a][y - 1];
else if(!y)res[i][j] = s[a][b] - s[x - 1][b];
else res[i][j] = s[a][b] - s[x - 1][b] - s[a][y - 1] + s[x - 1][y - 1];
}
}
return res;
}
};