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


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

题目

给定元素不变的矩阵,求各种子矩阵和。

思路

Given matrix = [
[3, 0, 1, 4, 2],
[5, 6, 3, 2, 1],
[1, , 0, 1, 5],
[4, 1, 0, 1, 7],
[1, 0, 3, , 5]
] sumRegion(2, 1, 4, 3) -> 8
(2,1) 为黄色range左上角的坐标, 所在坐标对应的点为2
(4,3) 为黄色range右下角的坐标, 所在坐标对应的点为0
黄色range中 2 + 0 + 0 + 1 + 0 + 1 + 0 + 3 + 0 = 8 比如, input matrix为
     2    0    -3    4
6 3 2 -1
5 4 7 3
2 -6 8 1

多加一行一列方便写code,变成dp matrix为

 0    0    0     0    0
2 0 -3 4
6 3 2 -1
5 4 7 3
2 -6 8 1

开始fill dp matrix

dp[i][j]表示sum of rectangle from (0,0) to matrix (i-1, j-1)

 0    0    0     0    0
2 2 -1 3 //-> first row: easy to fill(累加)
 0    0    0     0    0
2 -1 3 0 15
// -> first col: easy to fill(累加)
 0    0    0     0    0
0 2 2 -1 3
0 8 X -> dp[i][j] = dp[i-1][j] // 正上方 2
0 13 + dp[i][j-1] // 正左方 8
0 15 + matrix [i-1][j-1] // input matrix 该位置值
- dp[i-1][j-1] // 左上角 2 ,重复加了两次需要减去一次

代码

 class NumMatrix {
private int[][] dp; /* 1.build and fill dp matrix in O(m*n) time */
public NumMatrix(int[][] matrix) {
int row = 0;
int col = 0;
if (matrix.length != 0) {
row = matrix.length;
col = matrix[0].length;
}
dp = new int[row + 1][col + 1];
for (int i = 1; i < dp.length; i++) {
for (int j = 1; j < dp[0].length; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1] + matrix[i - 1][j - 1] - dp[i - 1][j - 1];
}
} } /*2. query in O(1) time */
public int sumRegion(int row1, int col1, int row2, int col2) {
/* coz dp matrix has size 1 greater one more than original matrix*/
row1++;
col1++;
row2++;
col2++;
return dp[row2][col2] - dp[row1 - 1][col2] - dp[row2][col1 - 1] + dp[row1 - 1][col1 - 1];
}
}

代码

 class NumMatrix {
private int[][] dp; /* 1.build and fill dp matrix in O(m*n) time */
public NumMatrix(int[][] matrix) {
int row = 0;
int col = 0;
if (matrix.length != 0) {
row = matrix.length;
col = matrix[0].length;
}
dp = new int[row + 1][col + 1];
for (int i = 1; i < dp.length; i++) {
for (int j = 1; j < dp[0].length; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1] + matrix[i - 1][j - 1] - dp[i - 1][j - 1];
}
} } /*2. query in O(1) time */
public int sumRegion(int row1, int col1, int row2, int col2) {
/* coz dp matrix has size 1 greater one more than original matrix*/
row1++;
col1++;
row2++;
col2++;
return dp[row2][col2] - dp[row1 - 1][col2] - dp[row2][col1 - 1] + dp[row1 - 1][col1 - 1];
}
}

[leetcode]304. Range Sum Query 2D - Immutable二维区间求和 - 不变的更多相关文章

  1. [LeetCode] 304. Range Sum Query 2D - Immutable 二维区域和检索 - 不可变

    Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...

  2. LeetCode 304. Range Sum Query 2D - Immutable 二维区域和检索 - 矩阵不可变(C++/Java)

    题目: Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper ...

  3. 304 Range Sum Query 2D - Immutable 二维区域和检索 - 不可变

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

  4. [LeetCode] Range Sum Query 2D - Immutable 二维区域和检索 - 不可变

    Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...

  5. leetcode 304. Range Sum Query 2D - Immutable(递推)

    Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...

  6. LeetCode 304. Range Sum Query 2D – Immutable

    Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...

  7. 【刷题-LeetCode】304. Range Sum Query 2D - Immutable

    Range Sum Query 2D - Immutable Given a 2D matrix matrix, find the sum of the elements inside the rec ...

  8. [LeetCode] Range Sum Query 2D - Mutable 二维区域和检索 - 可变

    Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...

  9. 【LeetCode】304. Range Sum Query 2D - Immutable 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 预先求和 相似题目 参考资料 日期 题目地址:htt ...

随机推荐

  1. js数组方法解析

    js 数组有很多方法,其中有的常用,有的不常用,归纳几个常用的方法,做个总结: 1. 转换方法: 1.1 valueOf():调用这个方法会返回数组本身 <script> var arr ...

  2. Tesseract-OCR4.0版本在VS2015上的编译与运行(转)

    最近刚开始接触识别库引擎方面的知识,由于项目中需要使用光学识别处理模块,在老师与朋友的推荐下,我开始接触tesseract光学识别库,在最开始从GitHub上下载的源代码进行编译的时候,出现了许多意想 ...

  3. 尚硅谷springboot学习19-日志切换

    查看相关依赖关系,排除相关依赖,引入新的日志依赖 slf4j+log4j的方式: <dependency> <groupId>org.springframework.boot& ...

  4. UNITY2018 真机开启deepprofiling的操作

    手机上运行游戏并开启deepprofiling的命令如下 命令一:adb shell am start -n com.szyh.YHP1.kaopu/com.szyh.YHP1.kaopu.MainA ...

  5. 混合app开发,h5页面调用ios原生APP的接口

    混合APP开发中,前端开发H5页面,不免会把兼容性拉进来,在做页面的兼容性同事,会与原生app产生一些数据交互: 混合APP开发,安卓的兼容性倒是好说,安卓使用是chrome浏览器核心,已经很好兼容H ...

  6. 30.SSH配置文件模板和类库.md

    目录 1.struts2 4.类库 1.struts2 1.<?xml version="1.0" encoding="UTF-8"?>2.< ...

  7. springboot 整合redis redis工具类

    一步 : pom中引入相关依赖 <!-- 引入 redis 依赖 --> <dependency> <groupId>org.springframework.boo ...

  8. 学JS的心路历程 - PixiJS -基础(一)

    建立canvas 今天开始我们一步步来看怎么使用PixiJS吧! 在开始之前,要先提醒各位需要先运行webserver,否则将会遇到一些奇怪的问题喔! 最基本的canvas画布是肯定需要的,Pixi提 ...

  9. yii基础控制器安全验证

  10. 使用yii\filters下的比如\PageCache需要在web.php里面的组件上配置'cache' => [ 'class' => 'yii\caching\FileCache', ],

    public function behaviors(){ /*需要在config文件下的web.php里面加上 'cache' => [ 'class' => 'yii\caching\F ...