zoukankan      html  css  js  c++  java
  • LeetCode-304. Range Sum Query 2D

    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).

    Range Sum Query 2D

    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);

     

  • 相关阅读:
    [转载]美国名校的与机器视觉相关的研发中心网址
    图像匹配方法浅谈
    Debug FFMpeg with CodeBlock
    zircobrowser 源代码学习 一个Android平台的浏览器,适合用在学UI
    iPhone addSubview sameview 是否会产生内存泄漏
    Android 游戏demo
    C# 多线程 注意问题 总结
    Builld with gloox
    论坛专用
    VMware vSphere Client(4.1/5.0/5.1/5.5/6.0) 客户端下载地址
  • 原文地址:https://www.cnblogs.com/wxisme/p/5211440.html
Copyright © 2011-2022 走看看