【思路】:前缀和
- 准备一个比原矩阵横列都大1的矩阵preSum来存储前缀和。
- preSum[i][j]中存储的是矩阵[0,0,i-1,j-1]对应的元素之和。
- 在类的构造函数中要初始化好preSum,需要用到已经定义好的preSum以及当前的矩阵元素。
- 在求和方法中,只需要在preSum中取数即可,不再需要遍历矩阵。
- 前缀和是一种牺牲空间换时间的方法。
- 在编码时需要注意数组下标,因为preSum比原矩阵多了一行一列,所以需要进行加1或者减1的操作。
class NumMatrix {
private int[][] preSum;
public NumMatrix(int[][] matrix) {
int m=matrix.length, n=matrix[0].length;
preSum=new int[m+1][n+1];
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){ //行数
preSum[i][j]=preSum[i-1][j]+preSum[i][j-1]-preSum[i-1][j-1]+matrix[i-1][j-1];
}
}
}
public int sumRegion(int row1, int col1, int row2, int col2) {
return preSum[row2+1][col2+1]-preSum[row2+1][col1]-preSum[row1][col2+1]+preSum[row1][col1];
}
}
/**
* Your NumMatrix object will be instantiated and called as such:
* NumMatrix obj = new NumMatrix(matrix);
* int param_1 = obj.sumRegion(row1,col1,row2,col2);
*/