323. Number of Connected Components in an Undirected Graph
题目链接:https://leetcode.com/problems...
这道题和numbers of islands II 是一个思路,一个count初始化为n,union find每次有新的edge就union两个节点,如果两个节点(u, v)原来不在一个连通图里面就减少count并且连起来,如果原来就在一个图里面就不管。用一个索引array来做,union find优化就是加权了,每次把大的树的root当做parent,小的树的root作为child。
public class Solution {
public int countComponents(int n, int[][] edges) {
// union find
int count = n;
// array to store parent
init(n, edges);
for(int[] edge : edges) {
int root1 = find(edge[0]);
int root2 = find(edge[1]);
if(root1 != root2) {
union(root1, root2);
count--;
}
}
return count;
}
int[] map;
private void init(int n, int[][] edges) {
map = new int[n];
for(int[] edge : edges) {
map[edge[0]] = edge[0];
map[edge[1]] = edge[1];
}
}
private int find(int child) {
while(map[child] != child) child = map[child];
return child;
}
private void union(int child, int parent) {
map[child] = parent;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。