- 详细入门
- 一般在遇到需要用到连通性的题干,第一反应应该想到用并查集。当然BFS,DFS也能解
- 一般模板如下。改进模板
private class UnionFind {
private int[] parent;
private int[] rank;
public UnionFind(int n) {
this.parent = new int[n];
this.rank = new int[n];
for (int i = 0; i < n; i++) {
this.parent[i] = i;
this.rank[i] = 1;
}
}
public void union(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX == rootY) {
return;
}
if (rank[rootX] == rank[rootY]) {
parent[rootX] = rootY;
rank[rootY]++;
} else if (rank[rootX] < rank[rootY]) {
parent[rootX] = rootY;
} else {
parent[rootY] = rootX;
}
}
public int find(int x) {
if (x != parent[x]) {
parent[x] = find(parent[x]);
}
return parent[x];
}
}
- 等式方程的可满足行
class Solution {
public boolean equationsPossible(String[] equations) {
int[] parent = new int[26];
for(int i = 0;i<26;i++){
parent[i] = i;
}
for(String equ:equations){
if(equ.charAt(1)=='='){
int left = equ.charAt(0)-'a';
int right = equ.charAt(3)-'a';
union(parent,left,right);
}
}
for(String equ:equations){
if(equ.charAt(1)=='!'){
int left = equ.charAt(0)-'a';
int right = equ.charAt(3)-'a';
if(find(parent,left)==find(parent,right))
return false;
}
}
return true;
}
public void union(int[] parent,int a,int b){
parent[find(parent,a)] = find(parent,b);
}
public int find(int[] parent,int index){
while (parent[index] != index) {
parent[index] = parent[parent[index]];
index = parent[index];
}
return index;
}
}
- 整数相除
- 省份数量
public int findCircleNum(int[][] isConnected) {
int res = 0;
int n = isConnected.length;
int[] parent = new int[n];
for(int i = 0;i<n;i++){
parent[i] = i;
}
for(int i = 0;i<n;i++){
for(int j = 0;j<n;j++){
if(isConnected[i][j]==1){
parent[find(i,parent)]=find(j,parent);
}
}
}
for(int i = 0;i<n;i++){
if(parent[i]==i)
res++;
}
return res;
}
private int find(int root,int[] parent){
while(root!=parent[root])
root=parent[root];
return root;
}