説明
配列を指定
n * m
マトリックス、移動行列ウィンドウ(サイズ
k * k
)、各移動でウィンドウ内の最大合計を見つけ、各反復で左上から右下にウィンドウを移動させます。
戻り 0
答えが存在しない場合。
例
例1:
Input:[[1,5,3],[3,2,1],[4,1,9]],k=2
Output:13
Explanation:
At first the window is at the start of the matrix like this
[
[|1, 5|, 3],
[|3, 2|, 1],
[4, 1, 9],
]
,get the sum 11;
then the window move one step forward.
[
[1, |5, 3|],
[3, |2, 1|],
[4, 1, 9],
]
,get the sum 11;
then the window move one step forward again.
[
[1, 5, 3],
[|3, 2|, 1],
[|4, 1|, 9],
]
,get the sum 10;
then the window move one step forward again.
[
[1, 5, 3],
[3, |2, 1|],
[4, |1, 9|],
]
,get the sum 13;
SO finally, get the maximum from all the sum which is 13.
例2:
Input:[[10],k=1
Output:10
Explanation:
sliding window size is 1*1,and return 10.
チャレンジ
O(N ^ 2)の時間。
アイデア:
テストサイト:
- そして、2次元の接頭辞
ソリューション:
- 和[i] [j]は、左上隅の座標(0,0)、右下の座標(i、j)と、サブ行列に格納されています。
- 和[I] [J] =行列[I - 1] [J - 1] +和[I - 1]〜[J] +和[I]、[J - 1] - 和[I - 1] [J - 1 ];再発は、二つの部分の合計、マイナス繰り返し計算部を評価することができます。
- int値=和[I] [J] - 和[I - K] [J] -sum [I] [J - K] +和[I - K] [J - K]; K * kがAによって得ることができますサブ行列のサイズ。
パブリッククラスソリューション{ / ** * @param行列:の整数配列のN * Mマトリクス * @paramのK:整数 * @return:最大数 * / パブリックINT maxSlidingMatrix(INT [] []行列、int型K) { //ここにコードを書く int型のn = matrix.lengthを。 IF(N == 0 || N <K) 戻り0; INT、M =マトリックス[0] .LENGTH。 もし(M == 0 || M <K) 戻り0; INT [] []和=新しいINT [N + 1] [M + 1]。 以下のために(INT I 0 =; I <= N; ++ I)の和[I] [0] = 0; 以下のために(INT I = 0; I <= M; ++ I)合計[0] [I] = 0; 以下のために(INT I 1 =; I <= N; ++ I) 用(INT J = 1; J <= M; ++ j)は 和[I] [J] =行列[I - 1] [J - 1] + 和[I - 1]〜[J] +和[I]、[J - 1] -和[I - 1] [J - 1 ]; int型MAX_VALUE =はInteger.MIN_VALUE。 以下のために(INT iがkは=; I <= N; ++ I) のために(INT J = K; J <= M; ++ J){ int値=和[I] [J] -和[I - K] [J] - 和[I] [J - K] +和[I - K] [J - K]。 IF(値> MAX_VALUE) MAX_VALUE =値。 } MAX_VALUE返します。 } }