leetcode1314. 矩阵区域和(动态规划)

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

通过计算矩阵的前缀和,每一个要求计算的矩阵区域,都可以通过矩阵的前缀和组合得到

代码

class Solution {
    public int[][] matrixBlockSum(int[][] mat, int K) {

        int n=mat.length,m=mat[0].length;
        int[][] dp=new int[n+1][m+1];
        int[][] res=new int[n][m];
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;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<=n;i++)
                for(int j=1;j<=m;j++)
                {
                    int left= Math.max(j-K-1,0);//确定边界
                    int right= Math.min(j+K,m);
                    int up= Math.max(i-K-1,0);
                    int down= Math.min(n,i+K);
                    res[i-1][j-1]=dp[down][right]-dp[up][right]-dp[down][left]+dp[up][left];//通过前缀和的组合,得出区域和
                }
        return res;

    }
}

你可能感兴趣的:(leetcode,leetcode,算法,java,动态规划)