计算任意一个矩阵中矩形块的和....由于这个操作是多次的,所以这个操作尽量应该快,我们限制在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);
本文介绍了一种在O(1)时间内计算二维矩阵任意矩形块元素之和的方法。通过预处理得到一个辅助矩阵,该矩阵存储从左上角到每个位置的累积和,从而能在常数时间内查询出任意矩形区域的总和。
840

被折叠的 条评论
为什么被折叠?



