目录
- 【力扣】304. 二维区域和检索 - 矩阵不可变
- 二维前缀和理论
- 初始化
- 计算面积
 
- 题解
 
【力扣】304. 二维区域和检索 - 矩阵不可变
给定一个二维矩阵 matrix,以下类型的多个请求:
- 计算其子矩形范围内元素的总和,该子矩阵的 左上角 为 (row1, col1),右下角 为(row2, col2)。
实现 NumMatrix 类:
- NumMatrix(int[][] matrix)给定整数矩阵- matrix进行初始化
- int sumRegion(int row1, int col1, int row2, int col2)返回 左上角- (row1, col1)、右下角- (row2, col2)所描述的子矩阵的元素 总和 。

提示:
 m == matrix.length
 n == matrix[i].length
 1 <= m, n <= 200
 - 1 0 5 10^5 105 <= matrix[i][j] <=  1 0 5 10^5 105
 0 <= row1 <= row2 < m
 0 <= col1 <= col2 < n
 最多调用  1 0 4 10^4 104 次 sumRegion 方法
二维前缀和理论
初始化

 
 因此二维前缀和预处理公式:
s[i][j] = s[i-1][j] + s[i][j-1] -s[i-1][j-1] + a[i][j]
计算面积

 
 因此二维前缀和计算公式:(以(x1,y1)为左上角,(x2,y2)为右下角的子矩阵的和)
s[x2][y2] - s[x2][y1 - 1] + s[x1 - 1][y2] -s[x1 - 1][y1 - 1]
题解
都加一,数组从(0,0)开始
class NumMatrix {int[][] s;public NumMatrix(int[][] matrix) {int m = matrix.length;if (m > 0) {int n = matrix[0].length;s = new int[m + 1][n + 1];// 初始化for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {s[i + 1][j + 1] = s[i][j + 1] + s[i + 1][j] - s[i][j] + matrix[i][j];}}}}// 计算面积public int sumRegion(int x1, int y1, int x2, int y2) {return s[x2 + 1][y2 + 1] - s[x2 + 1][y1] - s[x1][y2 + 1]  + s[x1][y1];}
}