这题如果用暴力方法,对于每次查询的矩阵,都去一个个遍历每个元素求和的话会超时。
用int[][] sum 数组存储前缀和,sum[i][j] 表示以点(0,0)为左上角,以点(i-1,j-1)为右下角的矩形内所有数之和。比如sum[2][3]表示右下角是点(1,2),这个矩形内有2*3=6个元素。
递推公式:sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + matrix[i-1][j-1]
如下图所示,整个矩形代表sum[i][j],它等于左边两个矩形(sum[i][j-1]) + 上面两个矩形(sum[i-1][j]) - 左上角的矩形(sum[i-1][j-1]) + 右上角的一个元素(matrix[i-1][j-1])
查询的时候,由于传进去来的是下标而不是个数,所以4个值都++
class NumMatrix {
int[][] sum;
public NumMatrix(int[][] matrix) {
int m = matrix.length, n = matrix[0].length;
sum = new int[m + 1][n + 1];
for(int i = 1; i <= m; i++){
for(int j = 1;j <= n; j++){
sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + matrix[i-1][j-1];
}
}
}
public int sumRegion(int row1, int col1, int row2, int col2) {
row1++; col1++; row2++; col2++;
return sum[row2][col2] - sum[row1-1][col2] - sum[row2][col1-1] + sum[row1-1][col1-1];
}
}