Range Sum Query系列解题报告

Range Sum Query - Immutable
https://leetcode.com/problems/range-sum-query-immutable/
这道题其实主要考虑的是减法,i~j的和就等于0~j的和减去0~i的和。
class NumArray {
private:
vector sum;
public:
    NumArray(vector &nums) {
        if(nums.size()==0) return;
        sum.push_back(nums[0]);
        for(int i=1;i
Range Sum Query 2D - Immutable
https://leetcode.com/problems/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> sum;
public:
    NumMatrix(vector> &matrix) {
        //if(matrix.size()==0||matrix[0].size()==0) return ;
        int row=matrix.size();
        int col=row>0?matrix[0].size():0;
        sum=vector >(row+1,vector(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);



你可能感兴趣的:(数据结构和算法)