跳到主要内容

304.二维区域和检索-矩阵不可变

链接:304.二维区域和检索-矩阵不可变
难度:Medium
标签:设计、数组、矩阵、前缀和
简介:给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2) 。

题解 1 - typescript

  • 编辑时间:2021-03-02
  • 执行用时:120ms
  • 内存消耗:42.9MB
  • 编程语言:typescript
  • 解法介绍:利用前缀和进行快速计算。
class NumMatrix {
private sumMatrix: number[][] = [];
constructor(matrix: number[][]) {
const rowLen = matrix.length;
if (rowLen === 0) return;
const colLen = matrix[0].length;
for (let row = 0; row < rowLen; row++) {
const arr: number[] = [];
for (let col = 0; col < colLen; col++) {
const num = matrix[row][col];
if (col === 0 && row === 0) {
arr.push(num);
} else if (col === 0) {
arr.push(this.sumMatrix[row - 1][col] + num);
} else if (row === 0) {
arr.push(arr[col - 1] + num);
} else {
arr.push(
this.sumMatrix[row - 1][col] + arr[col - 1] + num - this.sumMatrix[row - 1][col - 1]
);
}
}
this.sumMatrix.push(arr);
}
}
sumRegion(row1: number, col1: number, row2: number, col2: number): number {
return (
this.sumMatrix[row2][col2] -
(col1 > 0 ? this.sumMatrix[row2][col1 - 1] : 0) -
(row1 > 0 ? this.sumMatrix[row1 - 1][col2] : 0) +
(row1 > 0 && col1 > 0 ? this.sumMatrix[row1 - 1][col1 - 1] : 0)
);
}
}