Pythonの547フレンドサークルでLeetCode

クラスのNの学生があります。一部ではないながら、それらのいくつかは、友達です。彼らの友情は自然の中で推移です。AはBの直接の友人であり、BはCの直接の友人である場合たとえば、その後、AはCの間接的な友人であり、我々は友人の円が直接または間接的な友達である学生のグループで定義されました。

クラスの生徒との友人関係を表すN * N行列Mが与えられました。もしM [i]の[J] = 1は、i番目とj番目の生徒たちは、そうでなければ、互いに直接の友人ではありません。そして、あなたは出力に、すべての学生の間で友人サークルの合計数を持っています。

例1:

入力[[1,1,0]、
 [1,1,0]、
 [0,0,1]] 
出力:2 
説明:0番目と1番目の学生は、直接の友人なので、友人のサークルです。
第二学生自身が友人のサークルです。だから、2を返します。

 

例2:

入力[[1,1,0]、
 [1,1,1]、
 [0,1,1]] 
出力:1 
説明:0番目と1番目の生徒が直接友達で、第一及び第二の学生が直接の友人です、
その0番目と2番目の学生は間接的な友人です。それらのすべてが同じ友人のサークルにいるので、1を返します。

 

注意:

  1. Nは範囲[1200]です。
  2. Mのすべての学生のための[i]は[I] = 1。
  3. もしM [I] [J] = 1の場合、M [j]は[I] = 1。

溶液:

クラスのソリューション(オブジェクト):
     デフfindCircleNum(自己、M):
         "" " タイプM:リスト[一覧[INT] 
        :RTYPE:int型
        """ 
        マップ:キー:#値:グループ#1 
        #のリスト[I] => i番目の要素のグループ#1 
        行= LEN(M)
        GROUPMAP = [I  I における範囲(行)] 
        
        DEF DFS(グループインデックス):
            GROUPMAP [インデックス] = グループ
             のために COL、友人列挙(M [インデックス]):
                 もし!COL =インデックス友人GROUPMAP [COL] == COL:
                    DFS(グループ、COL)
            
        のための範囲(行):
             もし GROUPMAP [行] =行:続ける
            DFS(行、列)
                    
        戻りLEN(セット(GROUPMAP))を
                

DFS友人のタイトルで有名なサークル、アイデアはシリアル番号がマップの代わりに一覧表示するには、(図の通信に類似)までのすべての友人、これらの人々と同じグループを見つけ、0から開始し終了するには、対応するグループ番号のi番目の要素を表しそれはセット、友人の長手方向の円の、すなわち数をとります。

おすすめ

転載: www.cnblogs.com/lowkeysingsing/p/11204467.html