Range Sum Query 2D - Mutable

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
update(3, 2, 2)
sumRegion(2, 1, 4, 3) -> 10

Note:

  1. The matrix is only modifiable by the update function.

  2. You may assume the number of calls to update and sumRegion function is distributed evenly.

  3. You may assume that row1 ≤ row2 and col1 ≤ col2.

分析:https://segmentfault.com/a/1190000004238792

注意这道题说明了"calls to update and sumRegion function is distributed evenly"。我们可以先不考虑这道题的限制,根据这个两个方法使用次数分情况讨论:

  • update多,sumRegion少
    这种情况比较简单,我们可以直接复制矩阵,update的时候直接update对应点的值即可,sumRegion直接遍历指定范围内的值就可以了。

    update: O(1), sumRegion: O(mn)
  • update少,sumRegion多。
    我们可以不复制整个矩阵,而是在每个点处存(0, 0)到该的长方形内所有元素的和,这样的话,sumRegion的复杂度会很低,update的时候我们需要update所有受影响的sum。

    update: O(mn), sumRegion: O(1)
  • update多,sumRegion多(本题情况)
    我们可以每个点存对于该行,起始点到该点为止的sum。这样话,update的话,我们只需要update该行受影响的sum即可。sumRegion的话,我们只需要遍历相应行,加上不同行的对应sum即可。

    update: O(n), sumRegion: O(m)

当然,对于这种类型的题目,使用一些高级数据结构会更时间复杂度会更低,能达到logn,如二维线段树。这里只涉及基本的数据结构,尽量不搞复杂。

复杂度:

注:m指行数,n指列数,这里global的矩阵不算各个方法的extra space。

update

time: O(n), space: O(1)

sumRegion

time: O(m), space: O(1)

 public class NumMatrix {
int[][] rowSums; public NumMatrix(int[][] matrix) {
if (matrix.length == )
return;
rowSums = new int[matrix.length][matrix[].length]; // 建rowSums矩阵
for (int i = ; i < matrix.length; i++) {
for (int j = ; j < matrix[].length; j++) {
rowSums[i][j] = matrix[i][j] + (j == ? : rowSums[i][j - ]);
}
}
} public void update(int row, int col, int val) {
// 求出新值与旧值的差
int diff = val - (rowSums[row][col] - (col == ? : rowSums[row][col - ])); // 更新该行受影响的sum
for (int j = col; j < rowSums[].length; j++) {
rowSums[row][j] += diff;
}
} public int sumRegion(int row1, int col1, int row2, int col2) {
int res = ; // 逐行求和,每行的相应和为两sum相减
for (int i = row1; i <= row2; i++) {
res += rowSums[i][col2] - (col1 == ? :rowSums[i][col1 - ]);
}
return res;
}
} // Your NumMatrix object will be instantiated and called as such:
// NumMatrix numMatrix = new NumMatrix(matrix);
// numMatrix.sumRegion(0, 1, 2, 3);
// numMatrix.update(1, 1, 10);
// numMatrix.sumRegion(1, 2, 3, 4);

Range Sum Query 2D - Mutable & Immutable

就是没有update操作,这样的话,我们直接找出0,0 到每个点的和即可。

 public class NumMatrix {
int[][] matrix; public NumMatrix(int[][] m) {
matrix = m;
if (m == null || m.length == || m[].length == ) return;
for (int i = ; i < matrix[].length; i++) {
matrix[][i] += matrix[][i - ];
} for (int i = ; i < matrix.length; i++) {
matrix[i][] += matrix[i - ][];
} for (int i = ; i < matrix.length; i++) {
for (int j = ; j < matrix[].length; j++) {
matrix[i][j] += matrix[i - ][j] + matrix[i][j - ] - matrix[i - ][j - ];
}
}
} public int sumRegion(int row1, int col1, int row2, int col2) {
if (matrix == null) return ; if (row1 == && col1 == ) return matrix[row2][col2];
if (row1 == ) return matrix[row2][col2] - matrix[row2][col1 - ];
if (col1 == ) return matrix[row2][col2] - matrix[row1 - ][col2]; return matrix[row2][col2] - matrix[row1 - ][col2] - matrix[row2][col1 - ] + matrix[row1 - ][col1 - ];
}
} // 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);

Range Sum Query 2D - Mutable & Immutable的更多相关文章

  1. [Locked] Range Sum Query 2D - Mutable

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

  2. [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 ...

  3. Leetcode: Range Sum Query 2D - Mutable && Summary: Binary Indexed Tree

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

  4. LeetCode Range Sum Query 2D - Mutable

    原题链接在这里:https://leetcode.com/problems/range-sum-query-2d-mutable/ 题目: Given a 2D matrix matrix, find ...

  5. 308. Range Sum Query 2D - Mutable

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

  6. LeetCode 308. Range Sum Query 2D - Mutable

    原题链接在这里:https://leetcode.com/problems/range-sum-query-2d-mutable/ 题目: Given a 2D matrix matrix, find ...

  7. [Swift]LeetCode308. 二维区域和检索 - 可变 $ Range Sum Query 2D - Mutable

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

  8. [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 ...

  9. [LeetCode] Range Sum Query - Immutable & Range Sum Query 2D - Immutable

    Range Sum Query - Immutable Given an integer array nums, find the sum of the elements between indice ...

随机推荐

  1. vi和vim区别及命令详解

    vi和vim都是Linux中的编辑器,不同的是vim比较高级,可以视为vi的升级版本.vi使用于文本编辑,但是vim更适用于coding.     现将vim的命令行收集于下: vi有3个模式:插入模 ...

  2. js使用split函数按照多个字符对字符串进行分割的方法

    这篇文章主要介绍了js使用split函数按照多个字符对字符串进行分割的方法,实例分析了split函数的使用技巧,非常具有实用价值,需要的朋友可以参考下   本文实例讲述了js使用split函数按照多个 ...

  3. AngularJS API之isXXX()

    Angular中保存了很多的判断方法,可以用来验证对象是否符合某种要求,详细的参考代码样例即可 <html> <head> <meta http-equiv=" ...

  4. MySQL事物控制

    有时候我们需要保证事物的各个步骤都执行成功的前提下才能让每一步骤的事物执行,此时就需要事物控制. 事物控制用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败 ...

  5. OpenCV imread读取图片,imshow展示图片,出现cv:Exception at memory location异常

    问题如上.环境:VS2013. 代码如下: #include "stdafx.h" #include "opencv2\opencv.hpp" using na ...

  6. Hibernate get和load区别

    1.从返回结果上对比:load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常get方法检索不到的话会返回null   2.从检索执行机制上对比: ...

  7. Android学习笔记(十)——ListView的使用(上)

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! ListView绝对可以称得上是 Android中最常用的控件之一,ListView允许用户通过手指上下滑动的 ...

  8. Understand:高效代码静态分析神器详解(转)

    之前用Windows系统,一直用source insight查看代码非常方便,但是年前换到mac下面,虽说很多东西都方便了,但是却没有了静态代码分析工具,很幸运,前段时间找到一款比source ins ...

  9. native2ascii.exe

    native2ascii.exe 是 Java 的一个文件转码工具,是将特殊各异的内容 转为 用指定的编码标准文体形式统一的表现出来,它通常位于 JDK_home\bin 目录下,安装好 Java S ...

  10. PingUtil in Android

    Ping a host in Android:“ping -c 1 127.0.0.1”-c 1: The ping times. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 ...