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

    Question:

    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.

    Analysis:

    这是前面做的一个题目的升级版本,由原来的一维计算变为二维。http://www.cnblogs.com/little-YTMM/p/5188699.html 由于题目要求是一致的,因此思路也是一样的:在构造函数中存储中间和,然后在求和函数中利用中间和进行简单的计算,节省计算时间。

    在构造函数中计算中间和时,我们使每个元素存储从0至所有小于等于该行该列的数的和。(之前思路是,按行存储所有前面元素的和,这样到后面求和函数时要考虑N多种情况,特别复杂,于是放弃了。)

    Answer:

    public class NumMatrix {
        int[][] num;
        
        public NumMatrix(int[][] matrix) {
            num = null;
            if(matrix.length >0 && matrix[0].length > 0) {
                num = new int[matrix.length][matrix[0].length];
                for(int i=0; i<matrix.length; i++) {
                    for(int j=0; j<matrix[0].length; j++) {
                        if(i == 0) {
                            if(j == 0)
                                num[i][j] = matrix[i][j];
                            else
                                num[i][j] = matrix[i][j] + num[i][j-1];
                        }
                        else { //i != 0
                            if(j == 0) 
                                num[i][j] = matrix[i][j] + num[i-1][j];
                            else 
                                num[i][j] = num[i][j-1] + num[i-1][j] - num[i-1][j-1] + matrix[i][j];
                        }
                    }
                }
            }
            
        }
        public int sumRegion(int row1, int col1, int row2, int col2) {
            if(row1 == 0 && col1 == 0)
                return num[row2][col2];
            else if(row1 == 0)
                return num[row2][col2] - num[row2][col1-1];
            else if(col1 == 0)
                return num[row2][col2] - num[row1-1][col2];
            else 
                return num[row2][col2] - num[row2][col1-1] - num[row1-1][col2] + num[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);
  • 相关阅读:
    (转) 网络流之最大流算法(EdmondsKarp)
    如何在面试中发现优秀程序员
    Java中Volatile关键字详解
    比AtomicLong还高效的LongAdder 源码解析
    AtomicInteger的用法
    synchronized详解
    Java内部锁的可重用性(Reentrancy)
    Java可重入锁
    关于原生javascript的this,this真是个强大的东东
    js时间戳怎么转成日期格式
  • 原文地址:https://www.cnblogs.com/little-YTMM/p/5189457.html
Copyright © 2011-2022 走看看