并查集的基本概念见博客:https://www.cnblogs.com/xzxl/p/7226557.html
高效解决连接问题
三要素:
代码:
public class Template {
int[] pre;
public void init(int len){ //初始化pre数组
pre = new int[len];
for(int i=0;i
题意:现存在N个学生,学生与学生之间存在着朋友圈,若A是B的朋友,B是C的朋友,那么我们认为A,B,C在同一个朋友圈中,现在给定NxN的矩阵A,A[i][j]=1代表i和j是朋友。问总共有几个朋友圈?
输入:A = [[1,1,0],[1,1,0],[0,0,1]]
输出:2
输入:A = [[1,1,0],[1,1,1],[0,1,1]]
输出:1
public class Friend_Circles_547 {
public class UnionFind{
int[] pre; //记录x的上级是pre[x]
int count;
public void init(int n){
pre = new int[n];
for(int i=0;i
题意:给定一个数组A来表示一个图,A[i] = [u,v]表示在节点u,v之间存在边。
现在确保这个图(本身不是树)恰好通过只删除一条边可以变成树,请找出删除的边,若有多条,返回数组中最后出现的那一个。
输入:A = [[1,2],[1,3],[2,3]]
输出:[2,3]
输入:A = [[1,2], [2,3], [3,4],[1,4], 1,5]]
输出:[1,4]
public class Redundant_Connection_684 {
public class UnionFind{
int[] pre;
public void init(int len){
pre = new int[len+5];
for(int i=0;i
题意:给定一个NxN的矩阵,矩阵是由1x1的小格子组成,每个小格子中可能包含’/’, ’\’, ’’三种情况,返回矩阵中的连通区域。
输入:A = [“ /”, “/ ”]
输出:2
输入:A = [“\/”, “/\”]
输出:4
public class Regions_Cut_By_Slashes_959 {
public class UnionFind{
int[] pre;
public void init(int len){ //每一个正方形两对角线变成4个三角形,进行编号
pre = new int[len*len*4];
for(int i=0;i= 0)
uf.union(root + 0, (root - 4 * n) + 3);
// east west
if (j + 1 < n)
uf.union(root + 2, (root + 4) + 1);
if (j - 1 >= 0)
uf.union(root + 1, (root - 4) + 2);
}
}
for (int x = 0; x < 4 * n * n; x++) {
if (uf.find(x) == x)
res++;
}
return res;
}
}
有N对夫妇随机坐在2*N个座位上,现在要使每对夫妇都能牵手(相邻即可),我们需要交换一些人的座位,问最少需要交换多少次才能满足题意。
夫妇使用数字表示,(0,1)是一对夫妇,(2,3)是一对夫妇,以此类推。
提示:最多存在30对夫妇。