解析 力扣
class NumMatrix {
//用来存储 (0,0)到(i,j)到矩形面积
private int[][] local;
private int width;
private int height;
public NumMatrix(int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
width = 0;
height = 0;
} else {
height = matrix.length;
width = matrix[0].length;
local = new int[height][width];
local[0][0] = matrix[0][0];
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++){
if (i == 0 && j == 0)
continue;
//如果是第一行
if (i == 0)
local[i][j] = local[i][j - 1] + matrix[i][j];
//第一列
else if (j == 0)
local[i][j] = local[i - 1][j] + matrix[i][j];
//都不是就用公式
else {
local[i][j] = matrix[i][j] + local[i][j - 1] + local[i - 1][j] - local[i - 1][j - 1];
}
}
}
}
}
public int sumRegion(int row1, int col1, int row2, int col2) {
//首先判断local是否存在并且给出的定点是否符合要求
if (width == 0 || height == 0 || !(row1 >= 0 && row1 < height && col1 >= 0 && col1 < width && row2 >= 0 && row2 < height && col2 >= col1 && col2 < width && row2 >= row1 && col2 >= col1) )
return -1;
//用公式计算
//如果起点是(0,0)
if (row1 == 0 && col1 == 0)
return local[row2][col2];
//如果起点是第一行
else if (row1 == 0)
return local[row2][col2] - local[row2][col1 - 1];
//如果起点是第一列
else if (col1 == 0)
return local[row2][col2] - local[row1 - 1][col2];
else
return local[row2][col2] - local[row2][col1 - 1] - local[row1 - 1][col2] + local[row1 - 1][col1 - 1];
}
}