題名
2次元行列が与えられた場合、その長方形以下の範囲の要素の合計を計算します。部分行列の左上隅は(row1、col1)であり、右下隅は(row2、col2)です。
上の図では、部分行列の左上隅(row1、col1)=(2、1)および右下隅(row2、col2)=(4、3)、部分行列の要素の合計-長方形は8です。
例:
与えられた行列= [
[ 3、0、1、4、2 ]、
[5、6、3、2、1]、
[1、2、0、1、5]、
[4、1、0、1、7 ]、
[1、0、3、0、5]
]
sumRegion(2、1、4、3)-> 8
sumRegion(1、1、2、2)-> 11
sumRegion(1、2、2、4)-> 12
説明:
行列は不変であると想定できます。
sumRegionメソッドは複数回呼び出されます。
row1≤row2およびcol1≤col2であると想定できます。
関連トピック動的計画法
問題解決のアイデア
コードデモ
class NumMatrix {
int[][] sums;
public NumMatrix(int[][] matrix) {
if(matrix.length==0)
return;
else {
sums=new int[matrix.length][matrix[0].length];
//第一个矩阵的内容大小就是matrix值
sums[0][0]=matrix[0][0];
//子矩阵第一行的以左上角为顶点所有值的和
for(int i=1;i<matrix[0].length;i++)
sums[0][i]=sums[0][i-1]+matrix[0][i];
//同上,第一行改为第一列
for(int i=1;i<matrix.length;i++)
sums[i][0]=sums[i-1][0]+matrix[i][0];
//开始计算矩阵的其他部分,以子矩阵的左上角为起点
for(int i=1;i<matrix.length;i++)
for(int j=1;j<matrix[0].length;j++)
{
sums[i][j]=sums[i-1][j]+sums[i][j-1]-sums[i-1][j-1]+matrix[i][j];
}
}
}
public int sumRegion(int row1, int col1, int row2, int col2) {
//如果从子矩阵的左上角开始计算
if(row1==0&&col1==0)
return sums[row2][col2];
//起始点的横坐标是第一行
if(row1==0)
return sums[row2][col2]-sums[row2][col1-1];
//起始点的纵坐标在第一列
if(col1==0)
return sums[row2][col2]-sums[row1-1][col2];
//一般情况
return sums[row2][col2]-sums[row1-1][col2]-sums[row2][col1-1]+sums[row1-1][col1-1];
}
}
効果
情報の
回答は成功しました:
実行時間:15ミリ秒、Javaユーザーの60.40%を打ち負かしました
メモリ消費量:43.8 MB、Javaユーザーの92.62%を打ち負かしました