[题目链接](剑指 Offer II 013. 二维子矩阵的和 - 力扣(LeetCode) (leetcode-cn.com))
思路
- 对二维数组的每一行求前缀和
代码1
class NumMatrix {
int[][] pmatrix;
public NumMatrix(int[][] matrix) {
pmatrix = new int[matrix.length][matrix[0].length];
for(int i = 0; i < matrix.length; i++) {
pmatrix[i][0] = matrix[i][0];
for(int j = 1; j < matrix[i].length; j++) {
pmatrix[i][j] = pmatrix[i][j-1] + matrix[i][j];
}
}
}
public int sumRegion(int row1, int col1, int row2, int col2) {
int ans = 0;
for(int i = row1; i <= row2; i++) {
ans += col1 > 0 ? (pmatrix[i][col2] - pmatrix[i][col1-1]):pmatrix[i][col2];
}
return ans;
}
}
/**
* Your NumMatrix object will be instantiated and called as such:
* NumMatrix obj = new NumMatrix(matrix);
* int param_1 = obj.sumRegion(row1,col1,row2,col2);
*/
代码2
class NumMatrix {
int[][] pmatrix;
public NumMatrix(int[][] matrix) {
pmatrix = new int[matrix.length+1][matrix[0].length+1];
for(int i = 0; i < matrix.length; i++) {
int num = 0;
for(int j = 0; j < matrix[0].length; j++) {
num += matrix[i][j];、
//以(0,0)为左上角坐标,(i,j)右下角坐标的矩阵的所有元素之和等于以(0,0)为左上角坐标,(i-1,j)右下角坐标的矩阵加上第i行前j个数之和
pmatrix[i+1][j+1] = pmatrix[i][j+1] + num;
}
}
}
public int sumRegion(int row1, int col1, int row2, int col2) {//将子矩阵看成是四个左上角坐标为(0,0)的矩阵之间的运算
return pmatrix[row2+1][col2+1]+pmatrix[row1][col1]-pmatrix[row2+1][col1]-pmatrix[row1][col2+1];
}
}
Java知识
二维数组的行列长度
int[][] array = new int[N][M];
//行长度:
array.length
//列长度:
array[i].length