304. 二维区域和检索 - 矩阵不可变
给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2)。
上图子矩阵左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),该子矩形内元素的总和为 8。
示例:
1 | 给定 matrix = [ |
说明:
- 你可以假设矩阵不可变。
- 会多次调用 sumRegion 方法。
- 你可以假设 row1 ≤ row2 且 col1 ≤ col2。
方法一:二维前缀和
注意到矩阵不可变,我们可以使用二维数组保存数组的前缀和,然后就可以在O(1)时间复杂度内查到区域和。对于示例中的数组我们建立如下前缀和数组:
1 | 0 0 0 0 0 0 |
题中数组下标范围是0 <= row < matrix.length
和0 <= col < matrix[0].length
。子矩阵左上角(row1,col1),右下角(row2,col2)。子矩阵和 = sum[row2 + 1][col2 + 1] - sum[row2 + 1][col1] - sum[row1][col2 + 1] + sum[row1][col1]
。sum 数组多加一行一列是为了避免计算时下标是否越界判断。
1 | class NumMatrix { |
- 时间复杂度,初始化O(mn),查询O(1),其中 m 和 n 分别为数组的行数和列数。
- 空间复杂度O(mn)