朋友圈
1 题目描述
一个班上有 n 个同学,其中一些彼此是朋友,另一些不是。朋友关系是可以传递的,如果 a 与 b 直接是朋友,且 b 与 c 是直接朋友,那么 a 与 c 就是间接朋友。
定义 朋友圈 就是一组直接或者间接朋友的同学集合。
给定一个 n x n 的矩阵 isConnected 表示班上的朋友关系,其中 isConnected[i][j] = 1 表示第 i 个同学和第 j 个同学是直接朋友,而 isConnected[i][j] = 0 表示二人不是直接朋友。
返回矩阵中 朋友圈的数量。
示例 1:
输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
输出:2
示例 2:
输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]]
输出:3
提示:
- 1 <= n <= 200
- n == isConnected.length
- n == isConnected[i].length
- isConnected[i][j] 为 1 或 0
- isConnected[i][i] == 1
- isConnected[i][j] == isConnected[j][i]
2 解题(Java)
并查集:
class Solution {
int[] parents;
int[] rank;
int count;
public int findCircleNum(int[][] isConnected) {
int n = isConnected.length;
this.parents = new int[n];
this.rank = new int[n];
this.count = n;
for (int i = 0; i < n; i++) {
parents[i] = i;
rank[i] = 1;
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (isConnected[i][j] == 1) {
union(i, j);
}
}
}
return count;
}
public void union(int x, int y) {
int xp = find(x), yp = find(y);
if (xp == yp) return;
if (rank[xp] < rank[yp]) {
parents[xp] = yp;
rank[yp] += rank[xp];
} else {
parents[yp] = xp;
rank[xp] += rank[yp];
}
count--;
}
public int find(int x) {
while (true) {
if (x == parents[x]) {
return x;
}
x = parents[x];
}
}
}
3 复杂性分析
- 时间复杂度:O(N);
- 空间复杂度:O(N);