每日一题-304. 二维区域和检索 - 矩阵不可变

题目

链接
中等难度
其实leetcode的每日一题设计得还是比较精心的,昨天为一维的前缀和,今天这题可以联系到二维的前缀和。

我的提交

sumregion[(r1,c1),(r2,c2)]=presum[r2,c2]-presum[r1-1,c2]-preusum[r2,c1-1]+presum[r1-1,c1-1]

class NumMatrix {
public:
    vector < vector<int> > presum;

    NumMatrix(vector<vector<int>>& matrix) {

        if(!matrix.empty()){
            int r=matrix.size();
            int c=matrix[0].size();

            ////额外多一些空间方便设计,理解为-1行和-1列
            presum.resize(r+1);
            for(int i=0;i<r+1;i++)
                presum[i].resize(c+1);

            for(int i=1;i<=r;i++){
                for(int j=1;j<=c;j++){
                    presum[i][j]=presum[i-1][j]+presum[i][j-1]+matrix[i-1][j-1]-presum[i-1][j-1];
                }
            }
        }
    }
    
    int sumRegion(int row1, int col1, int row2, int col2) {
        row1+=1;
        col1+=1;
        row2+=1;
        col2+=1;
        return presum[row2][col2]-presum[row1-1][col2]-presum[row2][col1-1]+presum[row1-1][col1-1];
    }
};

注意点:

  • 还是要注意所给矩阵为空的情况
  • 为了方便设计,前缀和矩阵多个-1行和-1列的空间。实际写代码的时候题目所给矩阵和前缀和矩阵的下标要理清楚
  • 二维矩阵的前缀和本质上可以理解为求固定区域的面积,注意被重复计算的那块区域

执行用时:
16 ms, 在所有 C++ 提交中击败了98.55%的用户
内存消耗:
14.9 MB, 在所有 C++ 提交中击败了84.59%的用户

官方题解

题解其实也是这种做法:
第一个为一维前缀和,就是将所取区域分成一行一行求前缀和
第二个即二维前缀和

posted @ 2021-03-02 14:16  tlamm  阅读(65)  评论(0)    收藏  举报