0、相关题目
一维区间和,二维前缀和(当前文章)
1、描述
给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (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
来源:力扣(LeetCode)
链接:
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、关键字
区间和,内部元素和,二维
3、思路
和一维的一样,一维数组是前缀和,最后多开一个单位的空间,避免了第一个值得处理,让res[i+1]=res[i]+nums[i];
方法1:保存每一行的前缀和。等最后算结果的时候,按行循环遍历一遍。
一维区间和
public:
vector<int>res;
NumArray(vector<int>& nums) {
int n=nums.size();
//res.push_back(0);
res.resize(n+1); // 使用resize(n+1),第一个就不用处理了
for(int i=0;i<n;++i){
res[i+1]=res[i]+nums[i];
}
}
int sumRange(int i, int j) {
return res[j+1]-res[i];
}
};
方法二:直接2维求
4、notes
二维数组初始化:m行n列
vector<vector<int>>(m,vector<int>(n));
5、复杂度
时间:O(nm)初始化O(nm)检索O(M)
空间:O(n*m)
6、code
class NumMatrix {
public:
vector<vector<int>> mymatrix;
NumMatrix(vector<vector<int>>& matrix) {
size_t m=matrix.size();
if(m>0){ // 这里如果写成m>1,就不行
size_t n=matrix[0].size();
//mymatrix[0].resize(n+1,0);
//mymatrix.resize(m,mymatrix[0]);
mymatrix.resize(m,vector<int>(n+1));
for(size_t i=0;i<m;++i){
for(size_t j=0;j<n;++j){
mymatrix[i][j+1]=mymatrix[i][j]+matrix[i][j];
}
}
}
}
int sumRegion(int row1, int col1, int row2, int col2) {
int sum=0;
for(size_t i=row1;i<=row2;++i){
sum+=mymatrix[i][col2+1]-mymatrix[i][col1];
}
return sum;
}
};
/**
* Your NumMatrix object will be instantiated and called as such:
* NumMatrix* obj = new NumMatrix(matrix);
* int param_1 = obj->sumRegion(row1,col1,row2,col2);
*/