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. webform中使用webapi,并且使用autofac

    private void AutofacIoCRegister() { HttpConfiguration config = GlobalConfiguration.Configuration; if ...

  2. aop实现日志(转)

    文章来至于http://www.thinksaas.cn/group/topic/341436/ 第一:>>在spring的配置文件里增加以下配置 <!-- 支持 @AspectJ ...

  3. 使用微信JS-SDK调用微信浏览器的接口

    先附上微信公众平台的相关链接: 微信公众平台:https://mp.weixin.qq.com/ 微信公众平台开发文档:https://mp.weixin.qq.com/wiki 微信公众平台JS-S ...

  4. Xcode常用技巧(1)-使用Xcode进行代码分析及GDB调试

    1. 使用Xcode分析代码,分析分为静态分析及动态分析 静态分析:(Xcode-Product-Analyze)  检测代码是否有潜在的内存泄露  编译器认为不太合适的代码 运行结果: 若程序有 ...

  5. css外边距合并和z-index的问题

    参考这篇文章, 将外边距的 折叠 参考这篇文章, 将bfc的生成, bfc的应用 参考这篇文章 position: absolute的元素, 仍然具有内填充padding和border边框属性样式, ...

  6. Eclipse闪退无法打开的解决方法

    使用Eclipse过程中但是有时会出现打不开闪退的情况,这是为什么呢,遇到这种情况怎么解决.东坡小编通过查找资料,发现如下方法可以解决eclipse打不开闪退,具体操作如下: Eclipse打不开闪退 ...

  7. [AngularJS] 常用指令

    常用指令 ng-hide指令,用于控制部分HTML元素可见(ng-hide="false")和不可见状态(ng-hide="true"),如下: <div ...

  8. PHP基础之 重载 的实现方式

    ===================PHP中的伪重载Overloading================== PHP中没有像C#或java中的重载,但可以通其它方法实现重载 重载:属性重载与方法重 ...

  9. HDOJ 3507 Print Article

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  10. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...