2次元行列と対A(サイズk)のアレイの行と列を意味し、M所与。本来、2次元マトリックスは、マトリックス中にのみ海があることを意味し、すべて0です。リストのペアは、k個の演算子を有し、各オペレータは2つの整数A [i]が.Xを有し、A [i]が.Yは、[I] .Y]から[A [i]が.X]はグリッド行列を変更することができることを意味し島の海。各演算子の後にマトリックスにありますどのように多くの島を返します。
値は、二次元マトリックスのランクを与えられ、その後、操作の所定数の一連の後、島の各々は、1つの位置に挿入されています。島の数と、すべての島のレイアウトのこの事前分析は、それが1に決定され、島の分布が予め与えられ、又は操作の数を決定することができない、2次元マトリクスをスキャンする必要があるため、このシナリオは、使用の互いに素なセットに適している、同じではありません動作させるために配置します。代わりに、より簡単にDFSを使用します。これは、新しいコレクションを追加するの島と同等の各添加質問です。垂直および水平の島がこの新しい島か否かを判断プラス、存在する場合には、合成設定された後、現在の島を添加し、そして島の数を減らしました。
#のポイントの定義。 #のクラスPoint: # デフ__init __(自己、= 0、B = 0): # self.x = A # self.y = Bの クラスのソリューション: #1 @param {INT} nは整数 #1 @param {INT} M整数 #1 @param {パイント[]}演算子点の配列 #1 @return {[] int型}整数配列 DEF numIslands2(自己、N、M、オペレータ): なら ない、M 、または しない N 又は ない演算子: 戻り[ ] UF =UnionFind() RES = [] のためのp における マップ(ラムダ:(AX、AY)、演算子): UF.add(P) のための DX に(1,0)、(0,1)、(-1,0 )、(0、-1 ): Q =(DX [0] + P [0]、DX [1] + P [1 ]) であれば Q でUF.id: UF.union(P、Q) RES + = 【UF.count】 リターンRES クラスUnionFind(オブジェクト): デフ __init__ (自己): self.id = {}#のオブジェクト self.sz = {}#1 object'weight、ここでサイズ。 self.count = 0は デフ(自己、p)を追加します。 self.id [P] = P self.sz [P]は1 = self.count + = 1をデフ見つける(セルフ、I): ながら!I = self.id [I]: self.id [I] = self.id [self.id [I]#路径压缩 iは = self.id [i]は リターンiはDEF 組合(自己、P、Q): I = self.find (P) J = self.find(Q) もし I == J: リターン 場合self.sz [I]> self.sz [J]:#unionしか頭按秩合并上で動作する I、J = jは、私が self.id [I] = jは self.sz [i]が+ = self.sz [J] self.count - = 1
以上の動作が4Kである時間の合計最大数は、k個のオブジェクト。このため、時間複雑度はO((4K + K)ログ* K)の.log *は5を超えない反復回数であり、時間の複雑さはO(k)の大きさです。空間的複雑さは、二つのdict(重みおよび父親)、O(k)の大きさです。キータプル値ので、スペースの消費量が非常に大きいので、MLE lintcode上の二次元座標を一次元に変換することができるたびに、この解決策は、キーが行う座標。
Leetcodeバージョンのソリューション:1次元デジタル式に2次元座標、我々は行数ではありません、列の番号をメモを取る必要があります!
クラス溶液(オブジェクト): DEF :numIslands2(自己、M、N、位置) "" " :タイプM:INT :タイプN:INT :タイプ体位:リスト[リスト[INT] :RTYPE:リスト[INT] " 「」 #の組合findメソッドの #の労働組合は、基本的なアーキテクチャは、ハッシュマップで機能を追加し、機能、労働組合の機能を見つけ、init関数を見つけます。 #余分なスペースを節約する方法、2Dをオン1Dに座標列の数を乗算行ない RESを= [] デルタ = [1,0、-1,0,1 ] UF = UnionFind() のために位置: UF.add([0] * N + [1 ]) のための I にはxrange(4 ): Xは [0] + = デルタ[i]は 、Yは [1] +デルタ= [I + 1 ] P = X * N + Y であれば、0 <= xで<M 及び 0 <= Y <N 及び P における UF.root: UF.union([0] * N + [1 ]、P) res.append( UF.cnt) 復帰RES クラスUnionFind(オブジェクト): デフ __init__ (自己): self.root = {} self.sz = {} self.cnt = 0 DEF (X、セルフ)を追加: self.root [X] = X self.sz [X] 1 = self.cnt + = 1 DEF見つけます(自己、X): #はノードのルートを見つけ ながら!X = :self.root [X] self.root [X] = self.root [self.root [X] X = self.root [X] リターンX デフユニオン(自己、x、y)は:#注意、単に労働組合兄、大きなものに小さな組合をリンク I = self.find(x)は J = self.find(y)の 場合 I = J:! #ない同じ組合で あれば self.sz [I] > self.sz [J]: self.root [J] = iの self.sz [i]が + = self.sz [J] 他: self.root [I] = jは self.sz [J] + = 自己。 SZ [I] self.cnt - = 1
ます。https://www.cnblogs.com/sherylwang/p/5576007.htmlで再現