leetcode765情侣牵手

这篇博客介绍了一个利用并查集数据结构解决情侣牵手问题的算法。通过将每对情侣视为图中的一个点,将相邻的非情侣节点进行连接,最终计算连通分量的数量来得出最少的交换次数。代码实现包括`UnionFind`类,以及`Solution`类的`minSwapsCouples`方法,该方法返回情侣调整到相邻坐位所需的最小交换次数。
摘要由CSDN通过智能技术生成

765.情侣牵手

终于自己写出来一次了。。。

思路就是把一对情侣看作图的一个点,相邻座位的非情侣(不连通)要连通,一趟遍历后,并查集的连通分量的数量是非情侣的数量

class UnionFind{
public:
    vector<int> parent;
    vector<int> size;
    int n;
    int setCount;//连通分量数目
public:
    UnionFind(int _n):n(_n),setCount(_n),parent(_n),size(_n,1){
        iota(parent.begin(),parent.end(),0);//范围赋值
    }

    int findset(int x){//找根节点
        return parent[x] == x?x:parent[x] = findset(parent[x]);
    }

    bool unite(int x,int y){//合并
        x = findset(x);
        y = findset(y);
        if(x==y){
            return false;
        }
        if (size[x]<size[y]){
            swap(x,y);
        }
        parent[y]=x;
        size[x]+=size[y];
        --setCount;
        return true;
    }
    bool connected(int x,int y){//判断是否连接
        x = findset(x);
        y = findset(y);
        return x==y;
    }
};


class Solution {
public:
    int minSwapsCouples(vector<int>& row) {
        int n=row.size();
        UnionFind uf = UnionFind(n/2);
        for(int i=0;i<n;i+=2){//把不连通的点连通(非情侣挨着坐变成情侣挨着坐,unite一次连通分量数减一)
            if(!uf.connected(row[i]/2,row[i+1]/2))
                uf.unite(row[i]/2,row[i+1]/2);
        }
        return n/2-uf.setCount;//原来的连通分量数减去遍历后,就是交换的次数

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值