目录
- 【力扣】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];}
}