一、题目名称java
Range Sum Query 2D(矩阵指定区域内的元素和)ide
二、题目地址函数
https://leetcode.com/problemset/algorithms/code
三、题目内容element
英文: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
中文:给定一个二维矩阵和两个坐标,求出以这两个坐标为左上角、右下角的矩形中的全部元素和开发
例如:get
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函数会被调用屡次it
四、解题方法io
这道题和第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