次のように内容は次のとおりです。
与えられた
matrix
、そしてtarget
、合計が空でない部分行列の数を返す ターゲットを。部分行列は、
x1, y1, x2, y2
すべてのセルの集合であるmatrix[x][y]
とx1 <= x <= x2
してy1 <= y <= y2
。二つの部分行列
(x1, y1, x2, y2)
とは、(x1', y1', x2', y2')
彼らが持っているいくつかは、それは異なっている座標が異なっている:例えば、場合x1 != x1'
。
例1:
入力:行列= [0,1,0]、[1,1,1]、[0,1,0]、目標= 0 出力:4 説明:0のみを含む4つの1x1の部分行列。
例2:
入力:行列= [1、-1]、[ - 1,1]、目標= 0 出力:5 説明:2×2の部分行列、と2つの2×1サブ行列、プラス2×2部分行列。
注意:
1 <= matrix.length <= 300
1 <= matrix[0].length <= 300
-1000 <= matrix[i] <= 1000
-10^8 <= target <= 10^8
ソリューションの概要:計算の時間複雑度は、暴力はO(n ^ 4)の方法であり、最大値は300 matrix.length、ACであってはならないです。これはO(n ^ 3)が行うことができますか?それを試してください。まず、2次元アレイval_gridの導入、var_gridをいう[M] [N]は、実施例1の入力と、例えば0から、この範囲内のn番目の列とM行目の値であり、[0,1,0] [1,1,1]、[0,1,0]]、val_gridする[0、1、0]、[1、2、1]、[1、3,1]。対応します どのように多くの等しい計算し、目標サブ行列を満たすために、マトリックスは、カラムとk番目val_gridように、このサブ行列及び各列に決定することができる、i番目の行間隔とj番目の行に容易である[I] [K] - val_grid [J- 1] [K](J> 0)、 範囲(0内の次の次数kは、lenが(行列[0]) を順次決定[J〜i]は、各列のターゲットに等しいです。蓄積及び記録が列0から開始しながら、仮定[0〜k]と列があれば、歴史を決定し、和を満たす列の数であるとして、合計を蓄積している-対象、取得するために[Jを〜I]息子O(N ^ 3)の複雑さを最適化するように右側の列の条件を満足する行列としてk個のサブマトリクスの数。
コードは以下の通りであります:
クラス溶液(オブジェクト): DEF :numSubmatrixSumTarget(セルフ、マトリックス、ターゲット) "" " :型マトリックス:リスト[リスト[INT] :型ターゲット:INT :RTYPE INT """ val_grid = [0 用 I で範囲(LEN(行列[0]))] のための J における範囲(LEN(行列))] のための J における範囲(LEN(行列[0])): 量 = 0 のための I における範囲(LEN(行列))。 量 + = 行列[I] [J] val_grid [I] [J] = 量 #1 印刷val_gridの RESの = 0 のための I における範囲(LEN(行列)) のために、J における範囲(I + 1 ): DIC = {} 量 = 0 のため、K で範囲(LEN(行列[I])): V = val_grid [I] [K] であれば J> 0: V - = val_grid [J-1 ] [K] 量 + =V なら量==ターゲット:RES + = 1 であれば量-目標でDIC: RES - + = DIC【量目標] DIC [量] = dic.setdefault(量を、0)+ 1 戻り RES