ここでのオリジナルタイトルリンク: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
秒。これは、以下の図に示されています。あるかもしれないことに注意してください 0
Sまたは 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を返します。
注意:
N
範囲の整数であろう[1, 500]
。mines
最大で長さを持つことになります5000
。mines[i]
長さが2である範囲内の整数で構成されます[0, N-1]
。- (また、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 }