Range Sum Query - Immutable
这道题其实主要考虑的是减法,i~j的和就等于0~j的和减去0~i的和。
class NumArray {
private:
vector<int> sum;
public:
NumArray(vector<int> &nums) {
if(nums.size()==0) return;
sum.push_back(nums[0]);
for(int i=1;i<nums.size();i++){
sum.push_back(sum[i-1]+nums[i]);
}
}
int sumRange(int i, int j) {
if(i==0) return sum[j];
else return sum[j]-sum[i-1];
}
};
// Your NumArray object will be instantiated and called as such:
// NumArray numArray(nums);
// numArray.sumRange(0, 1);
// numArray.sumRange(1, 2);
Range Sum Query 2D - Immutable
这道题是range sum query的变形,只不过是变成了二维数组。
对于二维数组:
a00 a01 a02 …… a0m
……
ai-10 ai-11 ai-12 …… ai-1j-1 ai-1j ……ai-1m
ai0 ai1 ai2 …… aij-1 aij…… aim
以sum数组,sum[i][j]表示0,0到i,j的和
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j]
注意到,因为需要sum[i-1][j] sum[i][j-1]的值,所以sum需要多加一行和一列。
则,row1,col1 row2 col2之间值=sum[row2+1][col2+1]-sum[row2+1][col1]-sum[row1][col1+1]+sum[row1][col1]
代码:
class NumMatrix {
private:
int row,col;
vector<vector<int>> sum;
public:
NumMatrix(vector<vector<int>> &matrix) {
//if(matrix.size()==0||matrix[0].size()==0) return ;
int row=matrix.size();
int col=row>0?matrix[0].size():0;
sum=vector<vector<int> >(row+1,vector<int>(col+1,0));
for(int i=1; i<=row; i++) {
for(int j=1; j<=col; j++) {
sum[i][j] = matrix[i-1][j-1] + sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] ;
}
}
}
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];
//return 0;
}
};
// Your NumMatrix object will be instantiated and called as such:
// NumMatrix numMatrix(matrix);
// numMatrix.sumRegion(0, 1, 2, 3);
// numMatrix.sumRegion(1, 2, 3, 4);