- 区域和检索 - 数组不可变
class NumArray {
public:
vector<int> sums;//只是声明,并未分配空间
NumArray(vector<int>& nums) {
int n = nums.size();
sums.resize(n+1);//重点初始化时需要分配容器空间,元素默认0
for(int i = 0;i < n;++i){
sums[i+1] = sums[i] + nums[i];
}
}
int sumRange(int i, int j) {
return sums[j+1] - sums[i];
}
};
/**
* Your NumArray object will be instantiated and called as such:
* NumArray* obj = new NumArray(nums);
* int param_1 = obj->sumRange(i,j);
*/
- 二维区域和检索 - 矩阵不可变
//一维数组前缀和
//即提前计算矩阵中每一行的前缀和
class NumMatrix {
public:
vector<vector<int> > sum;
NumMatrix(vector<vector<int>>& matrix) {
int n = matrix.size();
if(n > 0){//去除空数组的情况
int m = matrix[0].size();
sum.resize(n, vector<int>(m + 1));//二维数组分配空间
//大小为n*(m+1)
for(int i = 0;i < n;++i){
for(int j = 0;j < m;++j){
sum[i][j + 1] = sum[i][j] + matrix[i][j];
}
}
}
}
int sumRegion(int row1, int col1, int row2, int col2) {
int num = 0;
for(int i = row1;i <= row2;++i){
num += sum[i][col2 + 1] - sum[i][col1];
}
return num;
}
};
/**
* Your NumMatrix object will be instantiated and called as such:
* NumMatrix* obj = new NumMatrix(matrix);
* int param_1 = obj->sumRegion(row1,col1,row2,col2);
*/
//方法二:二维数组前缀和
//即计算sum[i][j]表示以(i,j)为右下角元素的子矩阵的和
class NumMatrix {
public:
vector<vector<int> > sum;
NumMatrix(vector<vector<int>>& matrix) {
int n = matrix.size();
if(n > 0){
int m = matrix[0].size();
sum.resize(n+1,vector<int>(m+1));
//这里和上面不同,n+1的原因是在写代码时sum(i+1,j+1)
//表示的是以matrix(i,j)为右下角的子矩阵和,这样写的好处
//是不用处理i=0或j=0的特殊情况
for(int i = 0;i < n;++i){
for(int j = 0;j < m;++j){
sum[i+1][j+1] = sum[i][j+1]+sum[i+1][j]-sum[i][j]+matrix[i][j];
}
}
}
}
int sumRegion(int row1, int col1, int row2, int col2) {
return sum[row2+1][col2+1]-sum[row1][col2+1]-sum[row2+1][col1]+sum[row1][col1];
}
};
/**
* Your NumMatrix object will be instantiated and called as such:
* NumMatrix* obj = new NumMatrix(matrix);
* int param_1 = obj->sumRegion(row1,col1,row2,col2);
*/
需要注意的是在https://leetcode-cn.com/problems/range-sum-query-2d-immutable/solution/er-wei-qu-yu-he-jian-suo-ju-zhen-bu-ke-b-2z5n/题解中
这里的推导应该是错的,正确的应该是+2*sumregion(0,0,row1-1,col1-1)