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. Delphi 使用MD5 比对文件

    使用MD5的方法比对CXimage里图片是否改变: Delphi7实现方法: uses IdHashMessageDigest function TForm1.GetImageMD5(cxImage: ...

  2. creator.d.ts 的错误

    //export class PhysicsCollider{ export class PhysicsCollider extends Collider{ ==================检查代 ...

  3. Haskell语言学习笔记(71)Semigroup

    Semigroup class Semigroup a where (<>) :: a -> a -> a sconcat :: NonEmpty a -> a stim ...

  4. centos7下找不到iptables文件

    最近在centos7下,搭建ftp服务,按照步骤一步一步来,发现 etc/sysconfig/iptables这个文件并不存在,然后去找解决方案, 原文地址:http://blog.csdn.net/ ...

  5. [PC]PHPCMS配置文件的读取

    --------------------------------------------------------------------------------------------------- ...

  6. [PHP]快速实现:将二维数组转为一维数组

    如何将下面的二维数组转为一维数组. $msg = array( array( 'id'=>'45', 'name'=>'jack' ), array( 'id'=>'34', 'na ...

  7. 11.枚举类.md

    目录 1.定义: 2.枚举类和普通类的区别: 2.1枚举类的简单构建: 2.2枚举类的成员变量.方法和构造 2.3实现接口的枚举类 1.定义: 2.枚举类和普通类的区别: 枚举类的默认修饰符是 pub ...

  8. 命令行下IIS的配置脚本Adsutil.vbs

    命令行下IIS的配置脚本Adsutil.vbs 2009-08-20 12:26:52  www.hackbase.com  来源:Jackal's Blog Jackal's Blog文件存在于:C ...

  9. windows下一分钟配置ngnix实现HLS m3u8点播

    1. 下载 nginx-1.5.10 for windows 2. 修改配置文件nginx-1.5.10\conf\nginx.conf,增加以下行到最后一个"}"的前一行: lo ...

  10. python3.6安装-windows

    1.打开python官网 2.找到下载链接 3.选择对应的版本下载 4.下载完成后打开安装包并执行,运行出该界面. 5.这里是安装到C盘上(默认安装) 6.此处为自定义安装 7.选择自定义安装,并全选 ...