并查集解题模板,写一个内部类
class DSU {
int[] ancestor;
public DSU(int len) {
parent = new int[len];
for (int i = 0; i < len; ++i)
parent[i] = i;
}
public int find(int x) {
return parent[x] != x ? parent[x] = find(parent[x]) : x;
}
public void union(int x, int y) {
parent[find(x)] = find(y);
}
}
作者:gfu
链接:https://leetcode-cn.com/problems/smallest-string-with-swaps/solution/bing-cha-ji-java-by-gfu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
//并查集 代码解读
class UnionFind {
int[] ancestor;
public UnionFind(int n) {
ancestor = new int[n];
for (int i = 0; i < n; ++i) {
ancestor[i] = i;
}
}
//让index1的根等于 index2的根,相当于合并两个元素所在的集合
public void union(int index1, int index2) {
ancestor[find(index1)] = find(index2);
}
//寻找index对应的根,不带路径压缩的写法是
public int find(int index) {
if (ancestor[index] == index) {
return ancestor[index];
}
return find(ancestor[index]);
}
//带路径压缩的写法
public int find(int index) {
if (ancestor[index] == index) {
return ancestor[index];
}
ancestor[index] = find(ancestor[index]);
return ancestor[index];
}
}