そして、2次元領域304の検索 - マトリックス不変308次元領域および取得 - 変数

304タイトル:

2次元マトリクスを与え、そのサブ矩形の和が要素のサブマトリクス(ROW1、COL1)の左上隅、右下隅(ROW2、COL2)の範囲で算出します。

 

サブ矩形要素8内の図の左上隅の部分行列の和(ROW1、COL1)=(2,1)、右下(ROW2、COL2)=(4,3)。

例:

与えられた行列= [
[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≤と仮定することができます。

コード:

各行には、接頭辞と0〜Nを保持しています。各長方形の横断エレメント、N行、O(N)の合計を計算します。

1  クラスNumMatrix {
 2  公共3      ベクトル<ベクトル< INT >> プレフィックス。
4      NumMatrix(ベクトル<ベクトル< INT >>&行列){
 5          であれば(matrix.empty()または行列[ 0 ] .empty()){
 6              接頭辞= {{ 0 }}。
7              リターン;
8          }
 9          INT M = matrix.size()、N =行列[ 0 ] .size()。
10          prefix.resize(M + 1、ベクトル< INT >(N + 10 ));
 11          のためにINT I = 1 ; Iは<= M; ++ I){
 12である             ためINT J = 1。 ; J <= N-; ++ J){
 13は                  接頭辞[I] [J] =接頭[I]、[J- 1。 +行列[I-] 1。 ] [J- 1 ];
 14              }
 15          } // 接頭辞[I]、[J]:0列の行の行列I-1、J-1そして要素
16      }
 。17      int型 sumRegion(INT ROW1、INT COL1、INT ROW2、INT COL2){
 18、IS         int型のres = 0 ;
19          のためにINT I = ROW1 + 1 ; I <= ROW2 + 1 ; ++ I){
 20の              RES + =接頭辞[I] [COL2 + 1 ] - 接頭辞[I] [COL1]。
21          }
 22          リターンRES。
23      }
 24  }。
25  
26  / * *
 27  *あなたNumMatrixオブジェクトがインスタンス化され、そのように呼ばれます:
 28  * NumMatrix * OBJ =新しいNumMatrix(マトリックス)
29  * INT PARAM_1 = obj-> sumRegion(ROW1、COL1、ROW2、COL2)。
30   * /

 

 

308タイトル:

あなたの2D行列行列を与える、すべての要素から成る右下(ROW2、COL2)の左上隅(ROW1、COL1)から矩形を計算してください。

矩形上記ピンク、長方形(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
更新(3、2、2)
sumRegion(2、1、4、3) - > 10
 

注意:

値行列行列のみ更新機能によって変更することができ
ますが、コール数のデフォルトの機能を更新することができますし、sumRegion機能が均等に分散される
ことができますデフォルトROW1≤ROW2、COL1 COL2≤


コード:

原理は以下の通りである、かろうじて動的プログラミングとしてカウント?(私は知りません。)

また304は、同じことを行うことができます。私がいないセグメントツリーとフェンウィックの木が、幸い、少量のデータを行う主な理由は、このアルゴリズムは生きることができるです。

 1 class NumMatrix {
 2 public:
 3     vector<vector<int>> dp;
 4     NumMatrix(vector<vector<int>>& matrix) {
 5         if(matrix.empty() or matrix[0].empty()){
 6             dp={{0}};
 7             return;
 8         }
 9         int m=matrix.size(),n=matrix[0].size();
10         dp.resize(m+1,vector<int>(n+1,0));
11         //dp[i][j]:matrix以i-1,j-1为右下角的矩形的元素和
12         for(int i=1;i<=n;++i){
13             dp[0][i]=dp[0][i-1]+matrix[0][i-1];
14         }
15         for(int i=1;i<=m;++i){
16             int cur_sum=0;
17             for(int j=1;j<=n;++j){
18                 cur_sum+=matrix[i-1][j-1];
19                 dp[i][j]=dp[i-1][j]+cur_sum;
20             }
21         } 
22     }
23     
24     void update(int row, int col, int val) {
25         int dif=val-(dp[row+1][col+1]-dp[row][col+1]-dp[row+1][col]+dp[row][col]);//差值
26         for(int i=row+1;i<dp.size();++i){
27             for(int j=col+1;j<dp[0].size();++j){
28                 dp[i][j]+=dif;
29             }
30         }
31     }
32     
33     int sumRegion(int row1, int col1, int row2, int col2) {
34         return dp[row2+1][col2+1]-dp[row2+1][col1]-dp[row1][col2+1]+dp[row1][col1];
35     }
36 };
37 
38 /**
39  * Your NumMatrix object will be instantiated and called as such:
40  * NumMatrix* obj = new NumMatrix(matrix);
41  * obj->update(row,col,val);
42  * int param_2 = obj->sumRegion(row1,col1,row2,col2);
43  */

 

おすすめ

転載: www.cnblogs.com/FdWzy/p/12370149.html