NumMatrix-2次元領域と検索マトリックス不変

題名

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%を打ち負かしました

おすすめ

転載: blog.csdn.net/tangshuai96/article/details/114278543