1つのアイデア、暴力行為、残業。
1つの インポートSYS 2 クラスのソリューション: 3 DEF maxDistance(自己、グリッド:' リスト[リストの[int] ') - > INT : 4 行= LEN(グリッド) 5 カラム= LEN(グリッド[ 0 ]) 6 ウォーターズ= [ ] 7 ランド= [] 8 ための I における範囲(行): 9 のための J における範囲(カラム): 10 であればグリッド[I] [J] == 0 : 11 waters.append([I、J]) 12 他: 13 lands.append([I、J]) 14 結果= - 1 15 のための I における範囲(LEN(水)): 16 curmin = sys.maxsize 17 用 J 中範囲(LEN(ランド)): 18 CUR = ABS(水[I] [ 0 ] -lands [j] [ 0 ])+ ABS(水[I] [ 1 ] [j]を-lands [ 1 ]) 19 もし CUR < curmin: 20 curmin = CUR 21 もし curmin = sys.maxsizeとcurmin>!結果: 22 結果= curmin 23 リターン結果
アイデア2、DFS、タイムアウト:
1つの インポートSYS 2 クラスのソリューション: 3つの DEF DFS(自己、グリッド、行、列、I、J、訪問、dirct、経路、DP): 4 あれば、私は< 0またはI> =行またはJ < 0またはj>は= カラム: 5 リターン - 1 6 場合訪問[I] [J] == 1 : 7 リターン - 1 8 もしグリッド[I] [J] == 1 : 9 のリターン経路 10 であればグリッド[I] [J] == 0とDP [I] [J]> 0 : 11 リターン経路+ dpが[i] [j]は 12 [I] [J] =訪問1 13 MINVAL = sys.maxsize 14 のためのディにおいて:dirct 15 、X = I +ジ[ 0 ] 16 、Y = J +ジ[ 1 ] 17 RESの=のself.dfs(グリッド、行、列、X、Y、訪問、dirct、経路+ 1 、DP) 18 なら RES = - !1及びRES < MINVAL: 19 MINVAL =のRES 20 21 [I] [j]を訪問= 0 22 もし!MINVAL = sys.maxsize: 23 リターンMINVAL 24 他: 25 リターン - 1 26 27 DEF maxDistance(自己、グリッド:' リスト[リストの[int] ') - > INT : 28 行= LEN(グリッド) 29 カラム= LEN(グリッド[ 0 ]) 30 であれば、行== 0または列== 0 : 31 リターン - 1 32 maxdis = - 1 33は、 訪問= [ 0 用 _ 中範囲(列)] のための _ 中範囲(行)] 34 dirct = [ - 1、0 ]、[ 0、1 ]、[ 1、0 ]、[ 0、 - 1 ] 35 DP = [ [ 0 用 _ 中範囲(列)] のための _ 中範囲(行)] 36 のための I における範囲(行): 37 用 J における範囲(カラム): 38 もしグリッド[I] [J] == 0 : 39 DIS = self.dfs(グリッド、行、列、I、J、訪問、dirct、0 、DP) 40 DP [I] [J] = DIS 41 なら DIS> 0とmaxdis < DIS: 42 maxdis = DIS 43 #print(DIS) 44 #print(DP) 45 リターン maxdis
3考えると、BFSは、正しい選択する必要があります。
ゲームはそれをしなかった場合には、DFSの一時間に従事、我々は非常に同様の問題の前に会った、また、DFSを使用TLE、BFSは、ACを使用することができます。
私は与え、それをしないの回答を参照すること。
1 クラスソリューション{ 2 公共 INT maxDistance(INT [] []グリッド){ 3 int型 M = grid.length、N =グリッド[ 0 ] .LENGTH。 4つの ブール[] []訪問= 新しいブール値[M] [N]。 5 キュー< INT []> Q = 新しい LinkedListの<> (); 6 のためには、(int型、I = 0 ; iが<M; iが++ ){ 7 用(INT J = 0 ; J <nであり、j ++ ){ 8 た場合(グリッド[I] [J] ==1 ){ 9は、 [I] [j]は=訪れ真。 10 q.offer(新しい INT [] {I、J})。 11 } 12 } 13 } 14 のint [] [] DIRS = 新しい INT [] [] {{ 1、0 }、{ 0、1 }、{ - 1、0 }、{ 0、 - 1 }}。 15 int型の結果= - 1 。 16 中(!q.isEmpty()){ 17 のintサイズ= q.size()。 18 一方(size--> 0 ){ 19 のint [] CUR = q.poll()。 20 結果= Math.max(その結果、グリッド[CUR [ 0 ] [CUR [ 1 ] - 1 )。 21 のために(INT [] DIR:DIRS){ 22 、INT X = CUR [ 0 ] + DIR [ 0 ]、Y = CUR [ 1 ] + DIR [ 1 ]。 23 であれば(x> = 0 && X <M && Y> = 0&& Y <N &&!訪問[X] [Y]){ 24 [X] [Y]は=訪れ真。 25 グリッド[X] [Y] =グリッド[CUR [ 0 ] [CUR [ 1 ]] + 1 。 26 q.offer(新しい INT [] {X、Y})。 27 } 28 } 29 } 30 } 31 リターン結果== 0?- 1 :結果; 32 } 33 }
私の実際の状況によると、私は算数の練習を自分自身に多くの時間を与えているとして、今では、最終的な評価の私のレベルのアルゴリズムのための時間です。
実際のデータ転送速度:
leetcode周レース:一般的に90分、4問題2。
書かれたインターネット補正ストローク:120分4問題は、一般に、1つを示します。
私は他の学生は、このようなことする質問をしました。
最終的な評価:「ショートボードを記入し、平均レベルのアルゴリズムを達成するために努力し、」アルゴリズムの練習の目標としてをする - 目標は到達します。
過去数ヶ月自分の努力に感謝します。