#include <vector>
#include <iostream>
using namespace std;
/*
Given a 2D matrix, find the sum of the elements inside the rectangle defined by
its upper left corner (row1, col1) and lower right corner(row2, col2).
For example:
Given 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
*/
// to preCompute the matrix, the time complexity for queries can be lowered down to O(1).
class NumMatrix {
private:
vector< vector<int> > sumMatrix;
private:
void preComputeMatrix(vector< vector<int> >& matrix) {
int m = matrix.size(), n = matrix[0].size();
for(int k = 1; k < m; ++k) {
matrix[k][0] += matrix[k-1][0];
}
for(int k = 1; k < n; ++k) {
matrix[0][k] += matrix[0][k-1];
}
for(int i = 1; i < m; ++i) {
for(int j = 1; j < n; ++j) {
matrix[i][j] += matrix[i-1][j] + matrix[i][j-1] - matrix[i-1][j-1];
}
}
}
public:
NumMatrix(vector< vector<int> >& matrix) {
sumMatrix = matrix;
preComputeMatrix(sumMatrix);
}
int sumRegion(int row1, int col1, int row2, int col2) {
return sumMatrix[row2][col2] - sumMatrix[row1 - 1][col2] - sumMatrix[row2][col1 - 1] + sumMatrix[row1-1][col1-1];
}
};
int main(void) {
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 sumMatrix(matrix);
int tmp = sumMatrix.sumRegion(2, 1, 4, 3);
int tmp_2 = sumMatrix.sumRegion(1, 1, 2, 2);
int tmp_3 = sumMatrix.sumRegion(1, 2, 2, 4);
cout << tmp << endl;
cout << tmp_2 << endl;
cout << tmp_3 << endl;
}
LeetCode 304. Range Sum Query 2D - Immutable
最新推荐文章于 2025-02-03 15:37:10 发布