问题描述 给定一个 n * n 的二维数组,用来表示班级成员的朋友关系。如果 M[i][j]
值为 1,表示第 i
人和第 j
人是朋友关系,如果值为 0,表示第 i
人和第 j
人不是朋友关系。朋友关系具有传递性,如 a 和 b 是朋友,b 和 c 是朋友,则 a 和 c 也是朋友。要求找出有班级中多少个朋友圈。题目链接:**点我 **
样例输入输出
输入: [[1,1,0],[1,1,1],[0,1,1]]
输出:1
输入: [[1,1,0],[1,1,0],[0,0,1]]
输出:2
问题解法 用并查集算法进行解答。假设每个人都有一个上层的朋友,如果该成员没有任何朋友,则其上层的朋友就是自己。首先,先初始化每个人的上层朋友,然后遍历二维数组,对每一对朋友关系,都分别找出这两个成员的最上层的朋友,如果值不相等,则将其合并,最后再遍历定义的上层朋友的数组,统计上层朋友是自己的成员个数,就是班级朋友圈的个数。代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 class Solution { private int findRoot (int [] friend, int i) { while (friend[i] != i) { i = friend[i]; } return i; } public int findCircleNum (int [][] M) { int n = M.length; int [] friend = new int [n]; for (int i = 0 ; i < M.length; i++) { friend[i] = i; } for (int i = 0 ; i < n; i++) { for (int j = i + 1 ; j < n; j++) { if (M[i][j] == 1 ) { int iRoot = findRoot(friend, i); int jRoot = findRoot(friend, j); if (iRoot != jRoot) { friend[iRoot] = jRoot; } } } } int count = 0 ; for (int i = 0 ; i < n; i++) { if (friend[i] == i) { count++; } } return count; } }