947.移除最多的同行或同列石头
947.移除最多的同行或同列石头
0:46:04
//1,要求每个石头横纵坐标上除了本身外,不能存在其他的石头。我们可以把同一个横坐标/竖坐标上的石头看作是一个联通的;
//2,每次获取两个石头的坐标(x,y),然后进行判断,如果两块石头处于同一个横坐标/竖坐标,我们就进行合并,直到遍历完整个数组;
//3.每次合并完之后,就会减少一个石头,我们记录一下合并了多少次,合并的次数就是
//我们移除的石头数量;
// 定义并查集类
class UnionFind{
// 构造函数初始化并查集
constructor(n){
this.parent = new Array(n).fill(0).map((item,index)=>index)
this.rank = new Array(n).fill(1)
this.count = n
}
// 查找元素的根节点
find(x){
if(this.parent[x] !== x){
this.parent[x] = this.find(this.parent[x])
}
return this.parent[x]
}
// 合并两个集合
union(x,y){
let rootX = this.find(x)
let rootY = this.find(y)
if(rootX === rootY){
return false
}
if(this.rank[rootX] < this.rank[rootY]){
this.parent[rootX] = rootY
this.rank[rootY] += this.rank[rootX]
}else{
this.parent[rootY] = rootX
this.rank[rootX] += this.rank[rootY]
}
this.count--
}
// 判断两个元素是否属于同一个集合
connected(x,y){
return this.find(x) === this.find(y)
}
// 获取集合的数量
getCount(){
return this.count
}
}
/**
* @param {number[][]} stones
* @return {number}
*/
var removeStones = function(stones) {
let len=stones.length
let uf=new UnionFind(len)
for(let i=0;i<len;i++){ //拿第一块石头
for(let j=1;j<len;j++){ //拿第二块石头
let [x1,y1]=stones[i]
let [x2,y2]=stones[j]
if(x1===x2||y1===y2){
uf.union(i,j)
}
}
}
return len-uf.count //总共石头数减去剩下的集合数量即为需要移除的石头数量
};

浙公网安备 33010602011771号