[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 left corner (row1, col1) and lower right corner (row2, col2).

[LeetCode] 304. Range Sum Query 2D - Immutable
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

Note:

  1. You may assume that the matrix does not change.
  2. There are many calls to sumRegion function.
  3. You may assume that row1 ≤ row2 and col1 ≤ col2.

二维区域和检索 - 矩阵不可变。

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

[LeetCode] 304. Range Sum Query 2D - Immutable

上图子矩阵左上角 (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
说明:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/range-sum-query-2d-immutable
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路跟303题类似,也是前缀和/DP。这里因为input矩阵不能修改,我们必须创建一个额外的二维数组记录结果。我这里给一个很好的图示帮助理解。

[LeetCode] 304. Range Sum Query 2D - Immutable

sumRegion(A,D) = sumRegion(O,D) - sumRegion(O,E) - sumRegion(O,F) + sumRegion(O,G)

其他部分跟一般的二维DP没有区别。

时间O(mn)

空间O(mn)

Java实现

 1 class NumMatrix {
 2     private int[][] dp;
 3 
 4     public NumMatrix(int[][] matrix) {
 5         // corner case
 6         if (matrix == null || matrix.length == 0) {
 7             return;
 8         }
 9         int m = matrix.length;
10         int n = matrix[0].length;
11         dp = new int[m + 1][n + 1];
12         for (int i = 0; i < m; i++) {
13             for (int j = 0; j < n; j++) {
14                 dp[i + 1][j + 1] = dp[i + 1][j] + dp[i][j + 1] + matrix[i][j] - dp[i][j];
15             }
16         }
17     }
18 
19     public int sumRegion(int row1, int col1, int row2, int col2) {
20         return dp[row2 + 1][col2 + 1] - dp[row1][col2 + 1] - dp[row2 + 1][col1] + dp[row1][col1];
21     }
22 }
23 
24 /**
25  * Your NumMatrix object will be instantiated and called as such:
26  * NumMatrix obj = new NumMatrix(matrix);
27  * int param_1 = obj.sumRegion(row1,col1,row2,col2);
28  */

 

LeetCode 题目总结

上一篇:力扣 304. 二维区域和检索 - 矩阵不可变 二维前缀和


下一篇:Python代码实操:详解数据清洗