就真并查集月?…可惜我只做了两题,要是每天做说不定已经学会并查集了…
题目
https://leetcode-cn.com/problems/min-cost-to-connect-all-points/
分析
代码
class Solution {
//计算曼哈顿距离
public static int dist(int[] p1,int[] p2){
return Math.abs(p1[0]-p2[0])+Math.abs(p1[1]-p2[1]);
}
public int minCostConnectPoints(int[][] points) {
//建立并查集并初始化每个节点的根节点都为自身
Union uf=new Union(points.length+1);
//建立边集
ArrayList<Edge> list=new ArrayList<>();
for(int i=0;i<points.length;i++){
for(int j=i+1;j<points.length;j++){
int[] p1=points[i];
int[] p2=points[j];
int len=dist(p1,p2);
if(len!=0)
list.add(new Edge(i,j,len));
}
}
//按边的长度从小到大排序
Collections.sort(list,(x,y)->(x.len-y.len));
int ans=0;
for(Edge e:list){
int x=e.x;
int y=e.y;
int len=e.len;
//如果两个点已联通
if(uf.find(x)==uf.find(y)){
continue;
}
//两个点未联通
else{
ans+=len;//加上两点之间的距离
uf.union(x,y);//合并两点
}
}
return ans;
}
}
class Union{
int[] parent;
public Union(int n){
parent=new int[n];
for(int i=0;i<n;i++){
parent[i]=i;
}
}
public void union(int index1,int index2){
parent[find(index1)]=find(index2);
}
public int find(int index){
if(parent[index]!=index){
parent[index]=find(parent[index]);
}
return parent[index];
}
}
class Edge{
public int x;
public int y;
public int len;
public Edge(int x,int y,int len){
this.x=x;
this.y=y;
this.len=len;
}
}
复杂度
我不会算复杂度。