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

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

  • 示例:

    给定 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 。

Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <vector>
using namespace std;

class NumMatrix {
public:
vector<vector<int>> sums;
NumMatrix(vector<vector<int>>& matrix) {
for (int i = 0; i < matrix.size(); ++i) {
vector<int> sum;
for (int j = 0; j < matrix[i].size(); ++j) {
if (i == 0) {
if (j == 0) {
sum.push_back(matrix[0][0]);
} else {
sum.push_back(matrix[0][j] + sum[j - 1]);
}
} else {
if (j == 0) {
sum.push_back(matrix[i][0] + sums[i - 1][0]);
} else {
sum.push_back(matrix[i][j] + sums[i - 1][j] + sum[j - 1] - sums[i - 1][j - 1]);
}
}
}
sums.push_back(sum);
}
}

int sumRegion(int row1, int col1, int row2, int col2) {
int result = sums[row2][col2];
if (row1 > 0) {
result -= sums[row1 - 1][col2];
}
if (col1 > 0) {
result -= sums[row2][col1 - 1];
}
if (row1 > 0 && col1 > 0) {
result += sums[row1 - 1][col1 - 1];
}
return result;
}
};

/**
* Your NumMatrix object will be instantiated and called as such:
* NumMatrix* obj = new NumMatrix(matrix);
* int param_1 = obj->sumRegion(row1,col1,row2,col2);
*/
int main() {
vector<vector<int>> 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}};

NumMatrix *obj = new NumMatrix(matrix);
std::cout << obj->sumRegion(2, 1, 4, 3) << std::endl; // -> 8
std::cout << obj->sumRegion(1, 1, 2, 2) << std::endl; // -> 11
std::cout << obj->sumRegion(1, 2, 2, 4) << std::endl; // -> 12
}