【leetcode刷题笔记】304.二维区域和检索 - 矩阵不可变

【leetcode刷题笔记】304.二维区域和检索 - 矩阵不可变_第1张图片

初始想法肯定是暴力解啊,这就不是求一个子矩阵的和,遍历求和就完事了啊。所以暴力代码如下:

class NumMatrix {
    int[][] matrix;
    //构造函数
    public NumMatrix(int[][] matrix) {
        if(matrix.length == 0) return;
        this.matrix = matrix;
    }
    
    public int sumRegion(int row1, int col1, int row2, int col2) {
        int sum = 0;
        for(int i = row1;i <= row2;i++) {
           for(int j = col1;j <= col2;j++) {
               sum += matrix[i][j];
           }
        }
        return sum;
    }
}

/**
 * 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刷题笔记】304.二维区域和检索 - 矩阵不可变_第2张图片

但实际上你会发现,中等题不会那么简单,而且这运行结果时间和空间复杂度太高了。

分析:为啥?如果我们对这个矩阵求100次1000次10000次,每次都是双循环是不是太耗时了?  每次都要加子矩阵的每一个元素,这造成n2的时间复杂度。有什么办法去解决呢?

如果我们对每一行都做一个备忘录,用一个数组代替prxmatrix[i][j],i表示i行,j从0开始到j结束该行元素的和。这不就简单了吗? 那么当给了我子矩阵得行与列 我直接

 sum += prefmatrix[row1][col2] - prefmatrix[row1][col1]; 好了,代码如下:
class NumMatrix {
    int[][] matrix;
    int[][] prefmatrix; //行前缀和数组
    //构造函数
    public NumMatrix(int[][] matrix) {
        if(matrix.length == 0) return;
        this.matrix = matrix;
        int row = matrix.length;
        int col = matrix[0].length;
        prefmatrix = new int[row][col+1];//扩一列更好 万一它只有一个元素呢
        //prefmatrix的第一列没有用到,是为了防止-1会造成数组越界
        for(int i = 0;i < row;i++) {
            for(int j = 0;j < col;j++) {
                if(j == 0) {
                    prefmatrix[i][j+1] = this.matrix[i][j];
                } else {
                    prefmatrix[i][j+1] = prefmatrix[i][j]+this.matrix[i][j];
                    //prefmatrix[i][j+1]存放着是matrix[i][0]到matrix[i][j]的和
                }
            }
        }
    }

    public int sumRegion(int row1, int col1, int row2, int col2) {
        int sum = 0;
        for(int i = row1;i <= row2;i++) {
            sum += prefmatrix[i][col2+1] - prefmatrix[i][col1];
        }
        return sum;
    }

【leetcode刷题笔记】304.二维区域和检索 - 矩阵不可变_第3张图片

你可能感兴趣的:(算法笔记,Java)