题目

题目来源:力扣(LeetCode)

给定一个二维矩阵 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:
image.png

输入:
[“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 (蓝色矩形框的元素总和)

思路分析

  1. 初始化时对矩阵的每⼀⾏计算前缀和,检索时对⼆维区域中的每⼀⾏计算⼦数组和,然后对每⼀⾏
    的⼦数组和计算总和。
  2. 具体实现⽅⾯,创建 m ⾏ n+1 列的⼆维数组 sums,其中 m 和 n 分别是矩阵 matrix 的⾏数和列
    数,nums[i] 为 matrix[i] 的前缀和数组。将 sums 的列数设为 n+1 的⽬的是为了⽅便计算每⼀⾏
    的⼦数组和,不需要对 col 1=0 的情况特殊处理。
  1. /**
  2. * @param {number[][]} matrix
  3. */
  4. var NumMatrix = function (matrix) {
  5. const m = matrix.length;
  6. if (m > 0) {
  7. const n = matrix[0].length;
  8. this.sums = new Array(m).fill(0).map(() => new Array(n + 1).fill(0));
  9. for (let i = 0; i < m; i++) {
  10. for (let j = 0; j < n; j++) {
  11. this.sums[i][j + 1] = this.sums[i][j] + matrix[i][j];
  12. }
  13. }
  14. }
  15. };
  16. /**
  17. * @param {number} row1
  18. * @param {number} col1
  19. * @param {number} row2
  20. * @param {number} col2
  21. * @return {number}
  22. */
  23. NumMatrix.prototype.sumRegion = function (row1, col1, row2, col2) {
  24. let sum = 0;
  25. for (let i = row1; i <= row2; i++) {
  26. sum += this.sums[i][col2 + 1] - this.sums[i][col1];
  27. }
  28. return sum;
  29. };
  30. /**
  31. * Your NumMatrix object will be instantiated and called as such:
  32. * var obj = new NumMatrix(matrix)
  33. * var param_1 = obj.sumRegion(row1,col1,row2,col2)
  34. */