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

    最后更新

    四刷
    10-Jan-2017

    白送的题。

    注意3点:

    1. int[][] dp最好长宽都多加一行。要不累加的时候第一行第一列都要当做特殊情况处理= =
    2. 注意index的选取= =容易混乱
    3. 我他妈了个逼的长得太帅了。

    Time:
    init: O(mn)
    query: O(1)

    Space: O(mn)

    public class NumMatrix {
        int[][] dp;
        
        public NumMatrix(int[][] matrix) {
            if (matrix.length == 0) return;
            dp = new int[matrix.length + 1][matrix[0].length + 1];
            for (int i = 1; i < dp.length; i++) {
                for (int j = 1; j < dp[0].length; j++) {
                    dp[i][j] += matrix[i-1][j-1] + dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1];
                }
            }
        }
    
        public int sumRegion(int row1, int col1, int row2, int col2) {
            return dp[row2 + 1][col2 + 1] + dp[row1][col1]
                  -dp[row1][col2 + 1] - dp[row2 + 1][col1];
        }
    }
    

    二刷。

    思路对了,不过做起来麻烦。主要是构建2-D dp Array的时候没有在原先基础上多加1行1列,这样各种EDGE CAES必须判断一下,否则出界。。

    多加一行一列就没这么多事了。

    dp[i][j]是(i,j)为右下角的矩形(的面积)。

    求某个矩形,用dp[i][j] - dp[i][j-1] - dp[i-1][j] + dp[i-1][j-1]就行了,但是我们定义的时候多定义了一行,所以对应坐标要跟着改变1。

    
    public class NumMatrix {
        
        int[][] dp;
        int shit;
        public NumMatrix(int[][] matrix) 
        {
            if(matrix.length == 0)
            {
                this.shit = 0;
               
            }
            else
            {
                this.dp = new int[matrix.length+1][matrix[0].length+1];
                this.shit = 1;
                
    
                
                for(int i = 1; i <= matrix.length;i++)
                {
                    for(int j = 1; j <= matrix[0].length;j++)
                    {
                        dp[i][j] = matrix[i-1][j-1] + dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1];
                    }
                }
                    
            }
            
            
            
        }
    
        public int sumRegion(int row1, int col1, int row2, int col2) 
        {
            if(this.shit == 0) return 0;
            return dp[row2+1][col2+1] - dp[row2+1][col1] - dp[row1][col2+1] + dp[row1][col1];
        }
    }
    

    三刷。

    白送的。。dp[][]

    4个正方形D-B-C+A

    public class NumMatrix {
        int[][] dp;
        int m;
        int n;
        public NumMatrix(int[][] matrix) {
            if (matrix.length == 0) return;
            m = matrix.length;
            n = matrix[0].length;
            dp = new int[m+1][n+1];
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    dp[i+1][j+1] = dp[i+1][j] + dp[i][j+1] - dp[i][j] + matrix[i][j];
                }
            }
        }
    
        public int sumRegion(int row1, int col1, int row2, int col2) {
            return dp[row2+1][col2+1] - dp[row2+1][col1] - dp[row1][col2+1] + dp[row1][col1];
        }
    }
    

  • 相关阅读:
    mojo 接口示例
    MojoliciousLite: 实时的web框架 概述
    接口返回json
    centos 6.7 perl 版本 This is perl 5, version 22 安装DBI DBD
    centos 6.7 perl 5.22 安装DBD 需要使用老的perl版本
    商业智能改变汽车行业
    商业智能改变汽车行业
    读MBA经历回顾(上)目的决定手段——北漂18年(48)
    perl 升级到5.20版本
    Group Commit of Binary Log
  • 原文地址:https://www.cnblogs.com/reboot329/p/5877821.html
Copyright © 2011-2022 走看看