Skip to content

Commit 12fec2f

Browse files
committed
feat: friend-circles
1 parent cb3cb68 commit 12fec2f

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

trie.friend-circles.py

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from typing import List
2+
3+
4+
class Solution:
5+
"""
6+
547. 朋友圈
7+
https://leetcode-cn.com/problems/friend-circles/
8+
班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。
9+
给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。
10+
"""
11+
def findCircleNum(self, M: List[List[int]]) -> int:
12+
# 总共 len(M) 个人
13+
p = [i for i in range(len(M))]
14+
# 最多有 len(M) 个关系,即每个人都不好朋友
15+
res = len(M)
16+
for i in range(len(M)):
17+
for j in range(len(M[0])):
18+
if M[i][j] == 1:
19+
res = self.union(p, i, j, res)
20+
return res
21+
22+
def union(self, p, i, j, res):
23+
p1 = self.parent(p, i)
24+
p2 = self.parent(p, j)
25+
# 如果这两个人的代表是同一个人,则陌生关系数量不变
26+
if p1 == p2:
27+
return res
28+
# 如果这两个是朋友,则关系熟减一
29+
p[p1] = p2
30+
return res - 1
31+
32+
def parent(self, p, i):
33+
root = i
34+
while p[root] != root:
35+
root = p[root]
36+
return root
37+
38+
39+
so = Solution()
40+
print(so.findCircleNum([
41+
[1, 1, 0],
42+
[1, 1, 1],
43+
[0, 1, 1]
44+
]))

0 commit comments

Comments
 (0)