给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (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。
类中matrix[i][j]表示的意思是,(0,0)到点(i,j)构成的矩形的和。
那么求点(i1,j1)到(i2,j2)构成的矩形的和如下图所示
若Sx代表区域类的总和
答案 = S - S2 - S3 - S1
class NumMatrix
{
vector<vector<int>> matrix;
public:
NumMatrix(vector<vector<int>> matrix)
{
int row = matrix.size();
if(row == 0)
return;
int col = matrix[0].size();
/*
this->matrix.resize(row);
for (int i = 0; i < row; i++)
{
matrix[i].resize(col);
}*/
this->matrix = vector<vector<int>>(row, vector<int>(col, 0));
int cnt = 0;
for (int i = 0; i < row; i++)
{
cnt += matrix[i][0];
this->matrix[i][0] = cnt;
}
cnt = 0;
for (int j = 0; j < col; j++)
{
cnt += matrix[0][j];
this->matrix[0][j] = cnt;
}
for (int i = 1; i < row; i++)
{
for (int j = 1; j < col; j++)
{
int cntRow = 0;
int cntCol = 0;
for (int k = 0; k < j; k++)
{
cntRow += matrix[i][k];
}
for (int k = 0; k < i; k++)
{
cntCol += matrix[k][j];
}
this->matrix[i][j] = this->matrix[i - 1][j - 1] + cntCol + cntRow + matrix[i][j];
}
}
}
int sumRegion(int row1, int col1, int row2, int col2)
{
if(matrix.size() == 0)
{
return 0;
}
else if(row1 > 0 && col1 > 0)
{
return matrix[row2][col2] - matrix[row2][col1 - 1] - matrix[row1 - 1][col2] + matrix[row1 - 1][col1 - 1];
}
else if(row1 == 0 && col1 > 0)
{
return matrix[row2][col2] - matrix[row2][col1 - 1];
}
else if(row1 > 0 && col1 == 0)
{
return matrix[row2][col2] - matrix[row1 - 1][col2];
}
else
{
return matrix[row2][col2];
}
}
};