矩阵区域和

题目描述:
给你一个 m * n 的矩阵 mat 和一个整数 K ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和:

i - K <= r <= i + K, j - K <= c <= j + K
(r, c) 在矩阵内。

思路分析:
1.dp[i][j]存储的是mat[0][0]到mat[i][j]的总和;
2.res存储的是矩阵和,确定矩阵的最左上角位置和右下角位置
在这里插入图片描述
3.如图,很轻松算出红色区域的和
在这里插入图片描述

class Solution {
    public int[][] matrixBlockSum(int[][] mat, int K) {
        int rlen=mat.length;
        int clen=mat[0].length;
        int[][]dp=new int[rlen+1][clen+1];
        int[][]res=new int[rlen][clen];
        for(int i=1;i<=rlen;i++){
            for(int j=1;j<=clen;j++){
                dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+mat[i-1][j-1];
            }
        }
        for(int i=1;i<=rlen;i++){
            for(int j=1;j<=clen;j++){
                int x0=Math.max(0,i-K-1);
                int y0=Math.max(0,j-K-1);
                int x1=Math.min(rlen,i+K);
                int y1=Math.min(clen,j+K);
                res[i-1][j-1]=dp[x0][y0]+dp[x1][y1]-dp[x0][y1]-dp[x1][y0];
            }
        }
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42174669/article/details/106165662