1、题目名称
Range Sum Query 2D(矩阵指定区域内的元素和)
2、题目地址
https://leetcode.com/problemset/algorithms/
3、题目内容
英文: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).
中文:给定一个二维矩阵和两个坐标,求出以这两个坐标为左上角、右下角的矩形中的所有元素和
例如:
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
注意:你可以假定矩阵不会发生变化,sumRegion函数会被调用多次
4、解题方法
这道题和第303题(Range Sum Query)类似。本题中给出的类名为NumMatrix,并且里面有两个函数。第一个函数为构造函数,第二个函数为sumRegion,这两个函数都是我们要实现的函数。
题目给出的代码结构如下:
public class NumMatrix {
public NumMatrix(int[][] matrix) {
}
public int sumRegion(int row1, int col1, int row2, int col2) {
}
}
// 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);
本题的解题思路也和303类似,由于sumRegion函数会被调用多次,所以不能采用每次调用该函数时从头统计所有元素的方法。
可以建立一个与给定矩阵行、列数相同的中间矩阵matrixSums,matrixSums中的每个位置的元素值,是原矩阵matrix中所有行数、列数不大于该位置的元素值的和。在调用sumRegion函数时,可以通过中间矩阵matrixSums快速计算出结果。
Java代码如下:
/**
* @功能说明:LeetCode 304 - Range Sum Query 2D - Immutable
* @开发人员:Tsybius2014
* @开发时间:2015年11月15日
*/
public class NumMatrix {
public int[][] matrixSums;
/**
* 构造函数
* @param matrix
*/
public NumMatrix(int[][] matrix) {
matrixSums = null;
if (matrix.length > 0 && matrix[0].length > 0) {
matrixSums = new int[matrix.length][matrix[0].length];
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (i == 0) {
if (j == 0) {
matrixSums[i][j] = matrix[i][j];
} else {
matrixSums[i][j] = matrixSums[i][j - 1] + matrix[i][j];
}
} else {
if (j == 0) {
matrixSums[i][j] = matrixSums[i - 1][j] + matrix[i][j];
} else {
matrixSums[i][j] = matrixSums[i - 1][j] +
(matrixSums[i][j - 1] - matrixSums[i - 1][j - 1]) +
matrix[i][j];
}
}
}
}
}
}
/**
* 给出左上角、右下角坐标,计算矩形区域内的元素和
* @param row1
* @param col1
* @param row2
* @param col2
* @return
*/
public int sumRegion(int row1, int col1, int row2, int col2) {
if (matrixSums == null || row1 > row2 || col1 > col2) {
return 0;
}
if (row1 == 0 && col1 == 0) {
return matrixSums[row2][col2];
} else if (row1 == 0) {
return matrixSums[row2][col2] - matrixSums[row2][col1 - 1];
} else if (col1 == 0) {
return matrixSums[row2][col2] - matrixSums[row1 - 1][col2];
} else {
return matrixSums[row2][col2] - matrixSums[row1 - 1][col2] -
(matrixSums[row2][col1 - 1] - matrixSums[row1 - 1][col1 - 1]);
}
}
}
END