LeetCode 764最大のプラス記号

ここでのオリジナルタイトルリンク:https://leetcode.com/problems/largest-plus-sign/

トピック:

2Dに  grid から(0、0)〜(N-1、N-1)に、すべてのセルが含まれて  1与えられたリストにそれらの細胞を除いて、  mines です  0最大軸整列プラス記号は何である  1グリッドに含まれているのは?プラス記号の順序を返します。何も存在しない場合は、0を返します。

軸整列プラス記号  1  次数kのは、」いくつかのセンターがある  grid[x][y] = 1 長さの4本の腕が一緒に  k-1 上がっを、下、左、右、および製  1秒。これは、以下の図に示されています。あるかもしれないことに注意してください  0Sまたは  1プラス記号の腕を超えS、プラス記号の唯一の関連面積は1秒のためにチェックされます。

次数kの枢軸同盟プラス記号の例:

注文1:
000
010
000

注文2:
00000
00100
01110
00100
00000

受注3:
0000000
0001000
0001000
0111110
0001000
0001000
0000000

例1:

入力:N = 5、鉱山= [4,2]
出力:2
説明:
11111
11111
11111
11111
11011
上記のグリッドでは、最大のプラス記号は、それらの順序2つが太字でマークされていることができます。

例2:

入力:N = 2、鉱山= []
出力:1
説明:
オーダー2のないプラス記号はありませんが、オーダー1であります。

例3:

入力:N = 1、鉱山= [0、0]
出力:0
説明:
そこにはプラス記号がないので、0を返します。

注意:

  1. N 範囲の整数であろう  [1, 500]
  2. mines 最大で長さを持つことになります  5000
  3. mines[i] 長さが2である範囲内の整数で構成されます  [0, N-1]
  4. (また、C、C ++、またはC#で提出されたプログラムは、わずかに小さい時間制限と判断されます。)

ソリューション:

各セルについて、プラス記号は右、アップおよび到達下、左、その分です。

私たちは、ブルートフォースを使用することができます。それは完全に各セルとO(N ^ 3)のためのO(N)を取るでしょう。

そうでなければ、私たちは、それぞれの行を反復処理することができ、各セルのfarest左の範囲を計算し、左から右へ。セルが0でない限り、accumlateの長さを保ちます。

右から左に各行を繰り返し、各セル用farest右リーチを計算します。

同じ列がfarestアップとダウン届く取得するために。

farest上下に達する、右、左から最小値を取得します。最終的な結果を更新します。

時間計算:O(N ^ 2)。

スペース:O(N ^ 2)。

ACのJava:

1  クラスソリューション{
 2      公共 INT orderOfLargestPlusSign(整数 Nは、int型{[] []鉱山)
 3          であれば(N <= 0 ){
 4              戻り 0 ;
5          }
 6          
7          INT [] []マトリックス= 新しい INT [N]、[N]。
8          のためには、int型 i = 0; iがNを<; Iは++ ){
 9              Arrays.fill(行列[I]、N)。
10          }
 11          
12          のためにINT []鉱山:鉱山){
 13             行列[鉱山[0] [鉱山[1] = 0 ;
14          }
 15          
16          のためにint型 i = 0; iがNを<; Iは++ ){
 17              のためにINT COL = 0、L = 0、COL <N; COL ++ ){
 18                  、L =行列[I] [COL] == 0を?0:L + 1 19                  行列[I] [COL] = Math.min(行列[I] [COL]、L)。
20              }
 21              
22              のためにINT COL = N-1、R = 0、COL> = 0; col-- ){
 23                  、R =行列[I] [COL] == 0?0:R + 1 24                 行列[I] [COL] = Math.min(行列[I] [COL]、R)。
25              }
 26              
27              のためにint型の列= 0、U = 0、行<N;行++ ){
 28                  、U =行列[行] [I] == 0?0:U + 1 29                  行列[行] [I] = Math.min(行列[行] [I]、U)。
30              }
 31              
32              のためにint型の行= N-1、D = 0;行> = 0; row-- ){
 33                  D =行列[行] [I] == 0?0:D + 1 34                  行列[行] [I] = Math.min(行列[行] [I]、D)。
35             }
 36          }
 37          
38          INT RES = 0 39          のためにint型 i = 0; iがNを<; Iは++ ){
 40              のためにINT J = 0であり、j <N; J ++ ){
 41の                  RES = Math.max(RES、行列[I] [J])。
42              }
 43          }
 44の         
45          戻りRES。
46      }
 47 }

 

おすすめ

転載: www.cnblogs.com/Dylan-Java-NYC/p/11776340.html