题目
一个班上有 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]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bLyHh0
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
并查集
class Solution {
public int find(int[]fa,int x){
if(fa[x]!=x) fa[x]=find(fa,fa[x]);
return fa[x];
}
public int findCircleNum(int[][] isConnected) {
int n=isConnected.length;
int[] fa=new int[n];
for(int i=0;i<n;i++){
fa[i]=i;
}
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(isConnected[i][j]==1){
if(find(fa,i)!=find(fa,j)){
fa[find(fa,i)]=find(fa,j);
}
}
}
}
int ans=0;
for(int i=0;i<n;i++){
if(find(fa,i)==i) ans++;
}
return ans;
}
}