给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2)。
上图子矩阵左上角 (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。
思路:这道题和上面一道题一样点我,这是这道题变成了二维矩阵,同样的我们申请一个二维矩阵dp,这里为了避免边界判断我们多加一行一列,dp[i][j]表示到[i,j]这个元素为止(包含[i,j]元素)的左上角的和是多少。那么如果我们要计算给定目标的值,我们的公式为:
dp[row2 + 1][col2 + 1] - dp[row2+1][col1] - dp[row1][col2+1] + dp[row1][col1];
注意这里我们多加了一行,所以要注意下标。
参考代码:
class NumMatrix {
public:
NumMatrix(vector<vector<int>> matrix) {
if (matrix.size() == 0 || matrix[0].size() == 0) {
return;
}
dp.resize(matrix.size() + 1, vector<int>(matrix[0].size()+1,0));
for (int i = 1; i < dp.size(); i++) {
for (int j = 1; j < dp[0].size(); j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + matrix[i-1][j-1];
}
}
}
int sumRegion(int row1, int col1, int row2, int col2) {
return dp[row2 + 1][col2 + 1] - dp[row2+1][col1] - dp[row1][col2+1] + dp[row1][col1];
}
private:
vector<vector<int>> dp;
};