计算任意一个矩阵中矩形块的和....由于这个操作是多次的,所以这个操作尽量应该快,我们限制在O(1)的时间代价内....很容易想到利用数组sum来保存矩阵中从最左顶点到(i,j)的和....利用矩阵块的加减可以推出任意矩形区域的和...
public class NumMatrix {
int[][] matrixSum;
public NumMatrix(int[][] matrix) {
if( matrix==null||matrix.length==0||matrix[0].length==0 )
{
matrixSum=matrix;
return ;
}
int m=matrix.length;
int n=matrix[0].length;
for( int i=1;i<m;i++ )
{
matrix[i][0]+=matrix[i-1][0];
}
for( int i=1;i<n;i++ )
{
matrix[0][i]+=matrix[0][i-1];
}
for( int i=1;i<m;i++ )
{
for( int j=1;j<n;j++ )
{
matrix[i][j]+=matrix[i-1][j]+matrix[i][j-1]-matrix[i-1][j-1];
}
}
matrixSum=matrix;
}
public int sumRegion(int row1, int col1, int row2, int col2) {
int sum=matrixSum[row2][col2];
if( row1!=0 )
{
sum-=matrixSum[row1-1][col2];
}
if( col1!=0 )
{
sum-=matrixSum[row2][col1-1];
}
if( row1!=0&&col1!=0 )
{
sum+=matrixSum[row1-1][col1-1];
}
return sum;
}
}
// 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);