剑指 Offer II 013. 二维子矩阵的和

112 阅读1分钟

剑指 Offer II 013. 二维子矩阵的和

理解题目意思 如下图例子

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

image.png

二维数组,

// 二维矩阵,求子矩阵的各项和
var NumMatrix = function (matrix) {
  var [m, n] = [matrix.length, matrix[0].length];
  var dp = Array.from({ length: m }, () => new Array(n + 1).fill(0));
  for (var i = 0; i < m; i++) {
    for (var j = 0; j < n; j++) {
      dp[i][j + 1] = dp[i][j] + matrix[i][j];
    }
  }
  this.dp = dp;
};
NumMatrix.prototype.sumRegion = function (row1, col1, row2, col2) {
  var dp = this.dp;
  var sum = 0;
  for (var i = row1; i <= row2; i++) {
    sum += dp[i][col2 + 1] - dp[i][col1];
  }
  return sum;
};

代码调试

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

image.png