方法一:并查集
class Solution(object):
def findCircleNum(self, M):
"""
:type M: List[List[int]]
:rtype: int
"""
if not M:
return 0
n = len(M)
roots = [-1]*n
rank = [0]*n
for i in range(n):
roots[i] = i
def find(i):
while i != roots[i]:
i = roots[i]
return i
def union(p,q):
proot = find(p)
qroot = find(q)
if rank[proot] > rank[qroot]:
roots[qroot] = proot
elif rank[proot] < rank[qroot]:
roots[proot] = qroot
else:
roots[qroot] = proot
rank[proot] += 1
for i in range(n):
for j in range(i,n):
if M[i][j] == 1:
union(i,j)
res = 0
for i in range(n):
if i == roots[i]:
res += 1
return res
方法二:DFS
class Solution(object):
def findCircleNum(self, M):
"""
:type M: List[List[int]]
:rtype: int
"""
if not M:
return 0
n = len(M)
fri = []
def dfs(i):
for row in range(n):
if M[i][row] == 1 and row not in fri:
fri.append(row)
dfs(row)
res = 0
for i in range(n):
if i not in fri:
dfs(i)
res += 1
return res