领扣(LeetCode)二维区域和检索 个人题解

Posted Axiangcoding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了领扣(LeetCode)二维区域和检索 个人题解相关的知识,希望对你有一定的参考价值。

给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2)。

技术分享图片
上图子矩阵左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),该子矩形内元素的总和为 8。

示例:

给定 matrix = [
  [3, 0, 1, 4, 2],
  [5, 6, 3, 2, 1],
  [1, 2, 0, 1, 5],
  [4, 1, 0, 1, 7],
  [1, 0, 3, 0, 5]
]

sumRegion(2, 1, 4, 3) -> 8
sumRegion(1, 1, 2, 2) -> 11
sumRegion(1, 2, 2, 4) -> 12

说明:

  1. 你可以假设矩阵不可变。
  2. 会多次调用 sumRegion 方法
  3. 你可以假设 row1 ≤ row2 且 col1 ≤ col2。

 

对于这一题,一开始拿到以为是很简单的,还想着为什么会放在中等题里面。

虽然知道可能会出现超时的问题,但是第一次写还是尝试了暴力遍历求区域内值的和。答案虽然是正确的,当然显而易见报错了。超时。

后来想到了(其实还是参考了思路,拜托欸,我可是萌新,哪里接触过这种空间换时间的神奇操作 XD),其实,每个区域块到左上角的值都可以简化为上一个已经处理过的区域块的加减乘除的取值,然后加上当前的值。同时,某个子区域的块也能转换成以上块的加减乘除集合。

公式为:

(略)

代码如下:

class NumMatrix {
    int[][] matrix;
    int[][] markmatr;
    
    
    public NumMatrix(int[][] matrix) {
        this.matrix=matrix;
        int x=matrix.length;
        int y=x>0?matrix[0].length:0;
        markmatr=new int[x+1][y+1];
        for(int i=1;i<=x;i++)
        {
            for(int j=1;j<=y;j++)
            {
                markmatr[i][j]=markmatr[i-1][j]+markmatr[i][j-1]-markmatr[i-1][j-1]+matrix[i-1][j-1];
            }
        }
    }

    public int sumRegion(int row1, int col1, int row2, int col2) {
        int sum=0;
        sum=markmatr[row2+1][col2+1]-markmatr[row1][col2+1]-markmatr[row2+1][col1]+markmatr[row1][col1];
        return sum;
    }

}

 


以上是关于领扣(LeetCode)二维区域和检索 个人题解的主要内容,如果未能解决你的问题,请参考以下文章

领扣(LeetCode)两个列表的最小索引总和 个人题解

领扣(LeetCode)删除注释 个人题解

领扣(LeetCode)独特的电子邮箱地址 个人题解

领扣(LeetCode)回文链表 个人题解

领扣(LeetCode)最大连续1的个数 个人题解

领扣(LeetCode)移动零 个人题解