用C++代码实现以下功能:
给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2)。

上图子矩阵左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),该子矩形内元素的总和为 8。
答案:
答案一
class NumMatrix {
private:
vector<vector<int>> dp;
int rows = 0;
int cols = 0;
public:
NumMatrix(vector<vector<int>>& matrix) {
dp = std::move(matrix);
rows = dp.size();
if (rows)
cols = dp[0].size();
else
return;
for (int i = 1; i < rows; i++)
dp[i][0] += dp[i - 1][0];
for (int j = 1; j < cols; j++)
dp[0][j] += dp[0][j - 1];
for (int i = 1; i < rows; i++)
for (int j = 1; j < cols;j ++) {
dp[i][j] += dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1];
}
}
int sumRegion(int row1, int col1, int row2, int col2) {
auto ret = dp[row2][col2];
row1--;
col1--;
if (row1 >= 0)
ret -= dp[row1][col2];
if (col1 >= 0)
ret -= dp[row2][col1];
if (row1 >= 0 && col1 >= 0)
ret += dp[row1][col1];
return ret;
}
};
答案二
class NumMatrix {
private:
vector<vector<int>> sum;
public:
NumMatrix(vector<vector<int>>& matrix) {
if (matrix.empty())
return;
int m = matrix.size();
int n = matrix[0].size();
for (int i = 0; i < m; i++) {
sum.emplace_back(n, 0);
for (int j = 0; j < n; j++) {
if (i)
sum[i][j] += sum[i - 1][j];
if (j)
sum[i][j] += sum[i][j - 1];
if (i && j)
sum[i][j] -= sum[i - 1][j - 1];
sum[i][j] += matrix[i][j];
}
}
}
int sumRegion(int row1, int col1, int row2, int col2) {
int res = sum[row2][col2];
if (row1)
res -= sum[row1 - 1][col2];
if (col1)
res -= sum[row2][col1 - 1];
if (row1 && col1)
res += sum[row1 - 1][col1 - 1];
return res;
}
};
个人感觉这种题目没必要硬往面向对象来靠,还非得使用迭代器(可能是我用不习惯),自我感叹一句我好菜