【剑指offer】矩阵区域和
题目
给你一个 m x n 的矩阵 mat 和一个整数 k ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和:
i - k <= r <= i + k,
j - k <= c <= j + k 且
(r, c) 在矩阵内。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/matrix-block-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的答案
/**
* @param {number[][]} mat
* @param {number} k
* @return {number[][]}
*/
var matrixBlockSum = function (mat, k) {
const dp = new Array(mat.length).fill(0).map(() => Array(mat[0].length).fill(0));
for (let i = 0; i < mat.length; i++) {
for (let j = 0; j < mat[0].length; j++) {
dp[i][j] = mat[i][j];
if (i > 0) {
dp[i][j] += dp[i - 1][j];
}
if (j > 0) {
dp[i][j] += dp[i][j - 1];
}
if (i > 0 && j > 0) {
dp[i][j] -= dp[i - 1][j - 1];
}
}
}
const answer = new Array(mat.length).fill(0).map(() => Array(mat[0].length).fill(0));
for (let i = 0; i < mat.length; i++) {
for (let j = 0; j < mat[0].length; j++) {
const x1 = i + k >= mat.length ? mat.length - 1 : i + k;
const y1 = j + k >= mat[0].length ? mat[0].length - 1 : j + k;
answer[i][j] = dp[x1][y1];
const x0 = i - k - 1;
const y0 = j - k - 1;
if (x0 >= 0) {
answer[i][j] -= dp[x0][y1];
}
if (y0 >= 0) {
answer[i][j] -= dp[x1][y0];
}
if (x0 >= 0 && y0 >= 0) {
answer[i][j] += dp[x0][y0];
}
}
}
return answer;
};
我的答案就是按照前缀和的基本思路写了一遍,但是有很多判断,去判断有没有出界。
这里的优化方法就是在左边和上边再加一圈0,省去很多判断。
标题:【剑指offer】矩阵区域和
作者:limanting
地址:https://blog.manxiaozhi.com/articles/2021/10/06/1633535871997.html