leetcode 1314. 矩阵区域和(优质解法)

代码:

class Solution {
    public int[][] matrixBlockSum(int[][] mat, int k) {
        int m=mat.length;
        int n=mat[0].length;

        int[][]answer=new int[m][n];    //要返回的结果矩阵
        int[][]sum=new int[m+1][n+1];   //前缀和数组

        //初始化前缀和数组
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                sum[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+mat[i-1][j-1];
            }
        }

        //获取要计算区间的下标(x1,y1)(x2,y2)
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                int x1=Math.max(i-k,0)+1;
                int y1=Math.max(j-k,0)+1;
                int x2=Math.min(i+k,m-1)+1;
                int y2=Math.min(j+k,n-1)+1;

                answer[i][j]=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];
            }
        }

        return answer;
    }
}

题解:

        本题的题意可能有点不好理解,可以通过我下面画的图来进行理解

        如上图,当想要获得 answer[ i ][ j ] 的值时,需要计算 mat 数组中 (i-k,j-k)到 (i+k,j+k)这个矩形中的数据总和

        有关计算矩形中数据和的题目,通常使用二维前缀和来解决

        首先需要计算 mat 数组对应的二维前缀和数组 sum,sum[ i ][ j ] 就代表 mat 数组中从(1,1)下标到(i,j)下标二维数组数据的总和

        关于填充二维前缀和数组,以及如何利用二维前缀和数组计算出指定区间中的数据和,都在之前的博客中详细写过,推荐看牛客网 DP35 【模板】二维前缀和

        看了上述博客后解决该题目的主体就懂了,现在就要介绍一些细节问题,假设要计算的二维数组是(x1,y1)到(x2,y2)区间,按照题目的要求进行计算时会出现越界的情况,x1 和 y1 下标会出现比 0 小的情况,此时就需要把 x1 和 y1 放到 0 位置上,如下图所示,x2,y2 的下标会出现比 m-1,n-1 大的情况,此时也需要把 x2,y2,放到 m-1,n-1 的位置上

        在编写代码时还要注意前缀和数组是比 mat 和 answer 数组多一行一列的(为了消除边界影响),所以 mat[ i ][ j ] 对应 sum[ i+1 ][ j+1 ] 

相关推荐

  1. 每日一题:Leetcode1314.矩阵区域

    2023-12-22 08:38:02       38 阅读
  2. 每日OJ题_算法_前缀⑧_力扣1314. 矩阵区域

    2023-12-22 08:38:02       39 阅读
  3. LeetCode 304. 二维区域检索 - 矩阵不可变

    2023-12-22 08:38:02       15 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-22 08:38:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-22 08:38:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-22 08:38:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-22 08:38:02       20 阅读

热门阅读

  1. git stash 用法总结

    2023-12-22 08:38:02       35 阅读
  2. Http 请求体和响应体中重要的字段

    2023-12-22 08:38:02       32 阅读
  3. cka从入门到放弃

    2023-12-22 08:38:02       32 阅读
  4. nodejs设置x-xss-protection解决xss问题

    2023-12-22 08:38:02       39 阅读
  5. 一键启动脚本,Karfka,RocketMQ

    2023-12-22 08:38:02       67 阅读
  6. python初试三

    2023-12-22 08:38:02       47 阅读
  7. 使用汇编和反汇编引擎写一个x86任意地址hook

    2023-12-22 08:38:02       48 阅读
  8. leetcode做题笔记2866. 美丽塔 II

    2023-12-22 08:38:02       36 阅读
  9. css选择器

    2023-12-22 08:38:02       56 阅读
  10. R2S /NEO3(openwrt)几种固件试用总结

    2023-12-22 08:38:02       54 阅读
  11. proto与json的互相转换

    2023-12-22 08:38:02       46 阅读
  12. Pytorch:torch.nn.utils.clip_grad_norm_梯度截断_解读

    2023-12-22 08:38:02       44 阅读