Description:

Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper left corner (row1, col1) and lower right corner (row2, col2).

LeetCode-304. Range Sum Query 2D - Immutable

The above rectangle (with the red border) is defined by (row1, col1) = (2, 1) and (row2, col2) = (4, 3), which contains sum = 8.

Example:

Given matrix = [
  [3, 0, 1, 4, 2],
  [5, 6, 3, 2, 1],
  [1, 2, 0, 1, 5],
  [4, 1, 0, 1, 7],
  [1, 0, 3, 0, 5]
]

sumRegion(2, 1, 4, 3) -> 8
sumRegion(1, 1, 2, 2) -> 11
sumRegion(1, 2, 2, 4) -> 12

Note:

  1. You may assume that the matrix does not change.
  2. There are many calls to sumRegion function.
  3. You may assume that row1 ≤ row2 and col1 ≤ col2

和这个题型的第一题一样,只不过一维变成二维了,但是思路是一样的。先算出结果,避免重复计算。在算结果的时候也可以利用已经算好的结果来优化。sum[i][j]表示matrix[i][j]到matrix[0][0]的和,则一般的(i1, j1)到(i2, j2)的和为sum[i2][j2] - sum[i1-1][j2] - sum[i2][j1-1] + sum[i1-1][j1-1];边界(0,0)(0,x),(x,0)特殊考虑。在计算优化时也类似。

实现代码:

public class NumMatrix {
    
   /* Given matrix = [
  [3, 0, 1, 4, 2],
  [5, 6, 3, 2, 1],
  [1, 2, 0, 1, 5],
  [4, 1, 0, 1, 7],
  [1, 0, 3, 0, 5]
]
*/
    private int[][] matrix;
    
    private int[][] sum;

    public NumMatrix(int[][] matrix) {
        if(matrix == null)
            this.matrix = new int[0][0];
        else
            this.matrix = matrix;
        if(this.matrix.length == 0)
            sum = new int[0][0];
        else
            sum = new int[this.matrix.length][this.matrix[0].length];
        //边界
        if(sum.length !=0 && sum[0].length != 0) {
            sum[0][0] = this.matrix[0][0];
            for(int i=1; i<sum.length; i++) {
                sum[i][0] = this.matrix[i][0] + sum[i-1][0];
            }
            
            for(int j=1; j<sum[0].length; j++) {
                sum[0][j] = this.matrix[0][j] + sum[0][j-1];
            }
        }
        //计算sum
        for(int i=1; i<sum.length; i++) {
            for(int j=1; j<sum[i].length; j++) {
                sum[i][j] = this.matrix[i][j] + sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1];
                //System.out.println("("+i+","+j+"):"+sum[i][j]);
            }
            
        }
        
    }

    public int sumRegion(int row1, int col1, int row2, int col2) {
        if(row1 == 0 && col1 == 0)
            return sum[row2][col2];
        else if(row1 == 0 && col1 != 0)
            return sum[row2][col2] - sum[row2][col1-1];
        else if(row1 != 0 && col1 == 0)
            return sum[row2][col2] - sum[row1-1][col2];
        else
          return sum[row2][col2] - sum[row1-1][col2] - sum[row2][col1-1] + sum[row1-1][col1-1];
    }
    
}


// Your NumMatrix object will be instantiated and called as such:
// NumMatrix numMatrix = new NumMatrix(matrix);
// numMatrix.sumRegion(0, 1, 2, 3);
// numMatrix.sumRegion(1, 2, 3, 4);

 LeetCode-304. Range Sum Query 2D - Immutable

相关文章:

  • 2022-12-23
  • 2021-07-26
  • 2021-09-26
  • 2022-12-23
  • 2021-06-04
  • 2021-07-13
  • 2022-12-23
  • 2022-02-03
猜你喜欢
  • 2022-01-08
  • 2021-09-15
  • 2022-01-21
  • 2021-08-26
  • 2022-12-23
相关资源
相似解决方案