ウィンドウマトリックス最大スライディング

説明

配列を指定  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返します。
        } 
    }
    

      

おすすめ

転載: www.cnblogs.com/FLAGyuri/p/12078529.html
おすすめ