2次元行列と対A(サイズk)のアレイの行と列を意味し、M所与。本来、2次元マトリックスは、マトリックス中にのみ海があることを意味し、すべて0です。リストのペアは、k個の演算子を有し、各オペレータは2つの整数A [i]が.Xを有し、A [i]が.Yは、[I] .Y]から[A [i]が.X]はグリッド行列を変更することができることを意味し島の海。各演算子の後にマトリックスにありますどのように多くの島を返します。
例
例1:
Input: n = 4, m = 5, A = [[1,1],[0,1],[3,3],[3,4]]
Output: [1,1,2,2]
Explanation:
0. 00000
00000
00000
00000
1. 00000
01000
00000
00000
2. 01000
01000
00000
00000
3. 01000
01000
00000
00010
4. 01000
01000
00000
00011
分析:とも問題セットに見えます。隣人(上、下、左、とがある)の島場合、マージする必要があります。
/ ** *ポイントの定義。 *クラスPoint { * int型のX; * int型のy; *ポイント(){X = 0。Y = 0。} *ポイント(INT A、INT B){X = A。Y = B。} *} * / パブリック クラスソリューション{ / ** * @param N:整数 * @paramのM:整数 * @paramの演算子:点の配列 * @return :整数配列 * / パブリックリスト<整数> numIslands2 (整数 nは、整数M、ポイント[]演算子){ リスト<整数> RES = 新規のArrayList <> (); もし(演算子== NULL || operators.length == 0 ){ 戻りRES。 } int型 = []地図新しい INT [N×m個の]。 // 记录親 int型 CNT = 0; // 当前岛屿数 のint [] [] DIRS = {{-1、0}、{1,0}、{0、-1}、{0,1 }}。 用(int型 ; iがM * N <I ++は、I = 0 {) マップ[i]は = -1 。 } のための(点P:オペレータ){ int型* = M + PXインデックスのPy; // I最初派、私はすべての権利ドア起因oを左 IF(マップ[インデックス] -1 ==){ // 島IF既にポイントをチェック 地図[インデックス] = 指数; CNT ++ ; // 四方見つける ために(int型、Iはdirs.lengthを<; I = 0をIは++ ){ int型 X = PX + DIRS [I]を[0]; INT Y = Pyと+ DIRS [I] [1 ]; int型 nIndex = M + X * Y; IF(X <0 || X> Y = N- || <|| 0 Y> = M ||マップ[nIndex] == -1 ){ 続け; } INT nRoot = FindRootで(nIndex、マップ) INTのルート= FindRootで(インデックス、マップ) もし(!nRoot = ルート){ [nRoot】マッピング = ルートと、 CNT - ; } } } res.add(CNT)。 } 戻りRESと、 } プライベート INT FindRootで(int型、Iの値int []マップ){ 場合(I ==地図[I]){ 戻りIと、 } 戻りFindRootで(マップ[i]は、マップ)。 } }