问题描述:这里写链接内容
问题分析:
这道题与上题相似,稍微麻烦一点,就是每个点的值为以(0,0)为左上角,以该点为右下角的全部和。
当计算(row1,col1)到(row2,col2)时,就是计算newMatrix[row2][col2] - newMatrix[row2-1][col1] - newMatrix[row1][col2-1] + newMatrix[row1-1][col1-1].
为了代码方便,不放添加一个空的行和一列,这样就不用判断是否越界了。
代码如下:
public class NumMatrix {
int[][] sumMatrix;
int row;
int col;
boolean noVal = false;
public NumMatrix(int[][] matrix) {
this.row = matrix.length;
if(row == 0){
noVal = true;
return;
}
this.col = matrix[0].length;
if(col == 0){
noVal = true;
return;
}
sumMatrix = new int[row+1][col+1];
for(int i = 0;i<row+1;i++)
sumMatrix[i][0] = 0;
for(int i = 0;i<col+1;i++)
sumMatrix[0][i] = 0;
//init other
for(int i = 1;i<row+1;i++){
for(int j = 1;j<col+1;j++){
sumMatrix[i][j] = sumMatrix[i-1][j]+sumMatrix[i][j-1]-sumMatrix[i-1][j-1] + matrix[i-1][j-1];
}
}
}
public int sumRegion(int row1, int col1, int row2, int col2) {
if(noVal)
return 0;
return sumMatrix[row2+1][col2+1] - sumMatrix[row2+1][col1] - sumMatrix[row1][col2+1] + sumMatrix[row1][col1];
}
}
// 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);