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

Introduction

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

给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2)

Range Sum Query 2D
上图子矩阵左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),该子矩形内元素的总和为 8。

 

示例:

给定 matrix = [
  [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]
]

sumRegion(2, 1, 4, 3) -> 8
sumRegion(1, 1, 2, 2) -> 11
sumRegion(1, 2, 2, 4) -> 12

 

提示:

  • 你可以假设矩阵不可变。
  • 会多次调用 sumRegion 方法
  • 你可以假设 row1 ≤ row2 且 col1 ≤ col2

解法一

Analysis

LC303-range-sum-query-immutable 类似,相当于是他的扩展。

基本就两条公式的事情:

  • sum[0:i+1][0:j+1] = sum[0:i][0:j+1] + sum[0:i+1][0:j] - sum[0:i][0:j]
  • sumRange(r1,c1,r2,c2) = sum[0:r2+1][0:c2+1] + sum[0:r1][0:c1] - sum[0:r2+1][0:c1] - sum[0:r1][0:c2+1]

Implement

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class NumMatrix {
public:
NumMatrix(vector<vector<int>>& matrix)
:sum(matrix.size() + 1, vector<int>(matrix[0].size() + 1, 0)) {

for(int i = 0;i < matrix.size(); i++) {
for(int j = 0;j < matrix[0].size(); j++) {
sum[i+1][j+1] = sum[i][j+1] + sum[i+1][j] - sum[i][j] + matrix[i][j];
}
}
}

int sumRegion(int row1, int col1, int row2, int col2) {
return sum[row2+1][col2+1] + sum[row1][col1] - sum[row2+1][col1] - sum[row1][col2+1];
}
vector<vector<int>> sum;
};