Shu-How Zの小窝

Loading...

765.情侣牵手

765.情侣牵手

3:32

//遍历row数组,每次都去取出来两个人,我们知道正常的情侣他的编号从0开始的
//一堆正确的情侣就是一个是偶数一个是奇数;并且奇数=偶数+1;和奇数/2.==偶数/2;这个时候才是情侣;否则就需要将两个编号除以2之后的结果进行联通,进行交换次数:
//当N-1对配对成功的时候,最后一堆也会配对成功;我们只需要记录联通合并的次数就是我们可以调整的次数;

// 定义并查集类
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[]} row
 * @return {number}
 */
var minSwapsCouples = function(row) {
    let len=row.length
    let N=len>>1 //右移1位 相等于除以2
    let uf = new UnionFind(N)
    for(let i=0;i<len;i+=2){ //跳着循环,每次取两个值;
        uf.union(row[i]>>1,row[i+1]>>1) //拿到这两个人之后都给他除2,进行联通
    }
    return N-uf.getCount() //拿到联通的个数,然后减去N,就是需要交换的次数
};


6

posted @ 2025-05-27 16:41  KooTeam  阅读(13)  评论(0)    收藏  举报