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 + 1、0 )); 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 */