Question 2 Range Sum Query 2D

Method 1 off by 1

Step1:DP定义

  • prefixSum[i][j] represent the sum from matrix[0][0] to matrix[i-1][j-1](这样做的以后,所有的人都有左边和上面)

Step 2: Base Case

  • row 0 and col 0, off出来的行列:prefixSum

Step 3: induction rule

  • prefixSum[i][j] = matrix[i-1][j-1] + prefixSum[i][j-1] + prefixSum[i-1][j] -prefixSum[i-1][j-i]

Step 4:fill in order

  • 左上到右下

Step 5: 时空间复杂度

  • O(n^2)

Step 6: 如果你这么定义prefixSum,如何求Original Array里sum里(row1, col1)到(row2, col2)

  • sum of original[(row1, col1), (row2, col2)]

  • = prefixSum[row2 + 1][col2+ 1] - prefixSum[row1][col2+ 1]- prefixSum[row2 + 1][col1] + prefixSum[row1][col1]

class NumMatrix {
    int[][] prefixSum;
    public NumMatrix(int[][] matrix) {
        this.prefixSum = new int[matrix.length + 1][matrix[0].length + 1];
        precalculation(matrix);
    }
    private void precalcuation(int[][] matrix) {
        for (int i = 1; i <= matrix.length; i++) {
            for (int j = 1; j <= matrix[0].length; j++) {
                prefixSum[i][j] = prefixSum[i-1][j] + prefixSum[i][j-1] + matrix[i - 1][j - 1]'
            
            }
        }
    }

    public int sumRegion(int row1, int col1, int row2, int col2) {
        return prefixSum[row2 + 1][col2 + 1]- prefixSum[row2 + 1][col1]- prefixSum[row1][col2 + 1] + prefixSum[row1][col1];
    }
}

Method 2 NOT off by 1

javaStep1:DP定义

  • prefixSum[i][j] represent the sum from matrix[0][0] to matrix[i][j](ending at i, j, must including i, j)

  • 原理完全不变,只不过,不是每个点都有上面和左面


private void percalculation(int[][] matrix) {
    //单独讨论base case
    prefixSum[0][0] = matrix[0][0];
    for (int i = 1; i < matrix.length; i++) {
        prefixSum[i][0] = prefixSum[i-1][0] + matrix[i][0];
    }
    for (int j = 1; j < matrix[0].length; j++) {
        prefixSum[0][j] = prefixSum[0][j-1] + matrix[0][j];
    }
    for (int i = 1; i < matrix.length; i++) { //从上倒下
        for (int j = 1; j < matrix[0].length; j++) { // 从左到右
            prefixSum[i][j] = prefixSum[i-1][j]+  prefixSum[i][j-1] -prefixSum[i-1][j-1] + matrix[i-1][j-1];
        }
    }
}

public int sumRegion(int row1, int col1, int row2, int col2) {
    //单独讨论base case
    if (row1 == 0 && col1 == 0) {
        return prefixSum[row2][col2]'
    }
    if (row1 == 0) {   
        return prefixSum[row2][col2] - prefixSum[row2][col1 - 1];
    }
    if (col1 == 0) {   
        return prefixSum[row2][col2] - prefixSum[row1 - 1][col2];
    }
    return prefixSum[row2][col2] - prefixSum[row1 - 1][col2] - prefixSum[row2][col1 - 1] + prefixSum[row1 - 1][col1 - 1];
}

Last updated