Range Sum Query系列解题报告

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);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值