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
Note:
- You may assume that the matrix does not change.
- There are many calls to sumRegion function.
- You may assume that row1 ≤ row2 and col1 ≤ col2.
二维区域和检索 - 矩阵不可变。
给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2)。
上图子矩阵左上角 (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矩阵不能修改,我们必须创建一个额外的二维数组记录结果。我这里给一个很好的图示帮助理解。
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 */