class Solution {
public int minCostConnectPoints(int[][] points) {
int n = points.length;
Point[] pointArr = new Point[(n*(n-1))/2];
UnionFind uf = new UnionFind(n);
int index = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
int len = Math.abs(points[i][0] - points[j][0]) + Math.abs(points[i][1] - points[j][1]);
pointArr[index++] = new Point(i, j, len);
}
}
//方法:kruskal算法
Arrays.sort(pointArr,(Point p1,Point p2)->{
return Integer.compare(p1.val,p2.val);
});
int size = pointArr.length;
int edges = 0,length = 0;
for(int i=0;i<size;i++){
int x = pointArr[i].x;
int y = pointArr[i].y;
if(uf.find(x)!=uf.find(y)){
edges++;
uf.union(x,y);
length+=pointArr[i].val;
}
if(edges==n-1)break;
}
return length;
}
}
//并查集
class UnionFind {
int[] f;
public UnionFind(int n) {
f = new int[n];
for (int i = 0; i < n; i++) f[i] = i;
}
int find(int x) {
if (x == f[x]) return f[x];
return f[x] = find(f[x]);
}
void union(int x, int y) {
f[find(y)] = find(x);
}
}
class Point{
int x, y, val;
public Point(int x, int y, int val) {
this.x = x;
this.y = y;
this.val = val;
}
}
leetcode1584.连接所有点的最小费用
最新推荐文章于 2021-03-01 22:38:07 发布