一、题目
给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1)
,右下角为 (row2, col2)
。
二、解析
上一篇博客中,初始化时对数组计算前缀和,每次检索即可在 O(1)的时间内得到结果。可以将上一篇博客的做法应用于这道题,初始化时对矩阵的每一行计算前缀和,检索时对二维区域中的每一行计算子数组和,然后对每一行的子数组和计算总和。
具体实现方面,创建 m 行 n+1 列的二维数组 sums,其中 m 和 n 分别是矩阵 matrix 的行数和列数,sums[i] 为 matrix[i] 的前缀和数组。将 sums 的列数设为 n+1的目的是为了方便计算每一行的子数组和,不需要对 col1=0 ,如果col为0,那么就会出现-1的下标。
三、代码
class NumMatrix {
public:
vector<vector<int>> sums;
NumMatrix(vector<vector<int>>& matrix) {
int m = matrix.size();
if (m > 0) {
int n = matrix[0].size();
sums.resize(m, vector<int>(n + 1)); // 初始化二维数组和
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
sums[i][j + 1] = sums[i][j] + matrix[i][j]; // 计算每一行的和
}
}
}
}
int sumRegion(int row1, int col1, int row2, int col2) {
int sum = 0;
for (int i = row1; i <= row2; i++) {
sum += sums[i][col2 + 1] - sums[i][col1]; // 每一行的和,相加
}
return sum;
}
};
参考: