给定一个二维矩阵 matrix以下类型的多个请求:

  • 计算其子矩形范围内元素的总和,该子矩阵的 左上角(row1, col1)右下角(row2, col2)

实现 NumMatrix 类:

  • NumMatrix(int[][] matrix) 给定整数矩阵 matrix 进行初始化
  • int sumRegion(int row1, int col1, int row2, int col2) 返回 左上角 (row1, col1) 、右下角 (row2, col2) 所描述的子矩阵的元素 总和

 

示例 1:

输入: 
["NumMatrix","sumRegion","sumRegion","sumRegion"]
[[[[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]]],[2,1,4,3],[1,1,2,2],[1,2,2,4]]
输出: 
[null, 8, 11, 12]

解释:
NumMatrix numMatrix = new NumMatrix([[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]]]);
numMatrix.sumRegion(2, 1, 4, 3); // return 8 (红色矩形框的元素总和)
numMatrix.sumRegion(1, 1, 2, 2); // return 11 (绿色矩形框的元素总和)
numMatrix.sumRegion(1, 2, 2, 4); // return 12 (蓝色矩形框的元素总和)

 

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 200
  • -105 <= matrix[i][j] <= 105
  • 0 <= row1 <= row2 < m
  • 0 <= col1 <= col2 < n
  • 最多调用 104 次 sumRegion 方法
Related Topics
  • 设计
  • 数组
  • 矩阵
  • 前缀和

  • 👍 307
  • 👎 0
  • 和另一个题目LeetCode刷题【1314】矩阵区域和基本一毛一样

    同样的都是矩阵数据,都是求中间某个矩形部分的内的所有数字总和

    求这里的红色区域内的数字总和的话,就是

    红色区域的数字之和 = 蓝色区域的数字之和 – 黄色区域之和 – 紫色区域之和 + 黑色区域之和

    黑色区域的和值之前重复减掉的

    而求各个格子对应的左上区域的前缀和的方法

    29的蓝色框线区域内的所有数字之和 = 23格子代表的紫色框线区域的所有数字之和 + 28代表的黄色框线区域数字之和 – 22代表的黑色框线区域的所有数字之和 + 29这个格子内的值

    class NumMatrix {
    
        int[][] preSum;
    
        public NumMatrix(int[][] matrix) {
            preSum = new int[matrix.length][matrix[0].length];
            for (int row = 0; row < preSum.length; row++) {
                for (int col = 0; col < preSum[row].length; col++) {
                    preSum[row][col] = getMatrixNum( preSum, row-1, col)
                            + getMatrixNum( preSum, row, col-1)
                            - getMatrixNum( preSum, row-1, col-1)
                            + matrix[row][col];
                }
            }
        }
        
        public int sumRegion(int row1, int col1, int row2, int col2) {
            int sum = getMatrixNum(preSum, row2, col2)
                    + getMatrixNum(preSum, row1-1, col1-1)
                    - getMatrixNum(preSum, row2, col1-1)
                    - getMatrixNum(preSum, row1-1, col2);
            return sum;
        }
    
        public int getMatrixNum(int[][] matrix, int row, int col){
            if (row < 0 || col < 0){
                return 0;
            }
            return matrix[row][col];
        }
    }