LeetCode-【动态规划】-二维区域和检索 - 矩阵不可变

57 篇文章 3 订阅
51 篇文章 1 订阅

给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2)。

Range Sum Query 2D
上图子矩阵左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),该子矩形内元素的总和为 8。

示例:

给定 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

说明:

  1. 你可以假设矩阵不可变。
  2. 会多次调用 sumRegion 方法
  3. 你可以假设 row1 ≤ row2 且 col1 ≤ col2。

题解:简单的思路就是根据坐标和数组算出坐标区域内的数据和,但时间会超限,所以考虑一种更为简便的方法,之前我们做过不同路径的题目,那个题目的思路是从起始位置开始记录机器人到每个位置的路径总数,每个点得到的结果都是由其上方和左方点路径数的和,本题思路与之相似,不过是在计算的时候需要加上的是每个位置的数,再对应题目所给的两个坐标,即可算出相应区域和。

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

/**
 * Your NumMatrix object will be instantiated and called as such:
 * NumMatrix obj = new NumMatrix(matrix);
 * int param_1 = obj.sumRegion(row1,col1,row2,col2);
 */

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值