leetcode 547. 朋友圈

  1. 题目链接 https://leetcode-cn.com/problems/friend-circles/comments/

  2. 题目描述

    1. 班上有 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。

      给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。

    2. 示例 1:

      输入: 
      [[1,1,0],
       [1,1,0],
       [0,0,1]]
      输出: 2 
      说明:已知学生0和学生1互为朋友,他们在一个朋友圈。
      第2个学生自己在一个朋友圈。所以返回2。
      

      示例 2:

      输入: 
      [[1,1,0],
       [1,1,1],
       [0,1,1]]
      输出: 1
      说明:已知学生0和学生1互为朋友,学生1和学生2互为朋友,所以学生0和学生2也是朋友,所以他们三个在一个朋友圈,返回1。
      
  3. 解题思路

    1. 并查集:构建一个长度为len(M)列表,列表的下标代表一个人,值代表下标与值处于一个朋友圈。初始化时每个所有值都等于其下标,也就是说每个人的朋友圈只有他自己。遍历M,M[i][j] == 1并且i与j不处于一个朋友圈时就将i, j纳入一个圈子中。
  4. 代码

    1. python
      class Solution_547:
          def findCircleNum(self, M):
              N = len(M)
              F = [i for i in range(N)]
      
              def _find(a):
                  while a != F[a]:
                      a = F[a]
                  return a
      
              ans = N
              for i in range(N):
                  for j in range(i + 1, N):
                      if M[i][j]:
                          a, b = _find(i), _find(j)
                          if a != b:
                              ans -= 1
                              F[a] = b
              return ans
      
      
    2. c++
      class Solution {
      public:
          int findCircleNum(vector<vector<int>>& M) {
              vector<int> F(M.size(), -1);
              int ans = M.size();
              for(int i = 0; i < M.size(); ++i)
                  for(int j = i + 1; j < M.size(); ++j){
                      if (M[i][j]){
                          int a = find(i, F), b = find(j, F);
                          if (a != b){
                              ans--;
                              F[a] = b;
                          }               
                      }
                  }
              return ans;
          }
          int find(int a, vector<int>& f){
              while(f[a] != -1)
                  a = f[a];
              return a;
          }
      };

猜你喜欢

转载自blog.csdn.net/qq_38043440/article/details/88628851