Shu-How Zの小窝

Loading...

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 //总共石头数减去剩下的集合数量即为需要移除的石头数量
};
posted @ 2025-04-28 18:39  KooTeam  阅读(8)  评论(0)    收藏  举报