【剑指offer】矩阵区域和

  |   0 评论   |   0 浏览

题目

给你一个 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