LeetCode.304二维区域和检索 - 矩阵不可变

这题目本身难度并不大,但是描述得很奇怪。。。

给定一个二维矩阵 matrix,以下类型的多个请求:

计算其子矩形范围内元素的总和,该子矩阵的 左上角 为 (row1, col1) ,右下角 为 (row2, col2) 。

实现 NumMatrix 类:

    NumMatrix(int[][] matrix) 给定整数矩阵 matrix 进行初始化
    int sumRegion(int row1, int col1, int row2, int col2) 返回 左上角 (row1, col1) 、右下角 (row2, col2) 所描述的子矩阵的元素 总和 。

来源:力扣(LeetCode)
链接: https://leetcode-cn.com/problems/range-sum-query-2d-immutable
 


一个简单的二维数组前缀和问题:

LeetCode.304二维区域和检索 - 矩阵不可变_第1张图片

为什么从b[1][1] 开始,思考如何 初始化b[1][1]就明白了。

LeetCode.304二维区域和检索 - 矩阵不可变_第2张图片

 题目的思路就是这样了。。。

但是我在做题时遇到了一个用法,resize() 在二维数组中的应用,下面讲一下:

二维vector初始化

vector > a(2, vector(4,1));//2行*4列,初始化为1 
vector > a(2, vector(4));//后面不写初始值,默认为0
a.resize(10,vector(4));//10行4列默认0

 最后的代码:

class NumMatrix {
vector>a;
public:
    NumMatrix(vector>& matrix) {
        if(matrix.size() == 0)
        return ;
        a.resize(matrix.size()+1,vector(matrix[0].size() + 1));
       for(int i = 0;i < matrix.size();i++)
       {
           for(int j = 0;j < matrix[i].size();j++)
           {
               a[i+1][j+1] = a[i][j+1] + a[i+1][j] - a[i][j] + matrix[i][j];
           }
       }
    }
    
    int sumRegion(int row1, int col1, int row2, int col2) {
        return a[row2+1][col2+1]-a[row2+1][col1] - a[row1][col2+1] + a[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);
 */

你可能感兴趣的:(笔记,矩阵,leetcode,算法)