2020-5 leetcode 765. 情侣牵手

关键点:1.能分析出利用并查集联系在一起的情侣,必定是交叉的坐着。可以连成一个圈。使一个圈的情侣相邻而坐的话,交换次数为 n-1 n 是情侣数目。
2.当一对情侣正好邻座时,代表这个圈只有这一对情侣,交换次数为 1 - 1 = 0 次。
3.所有圈加起来之后 所交换的总次数正好是 总的情侣对数 - 总的圈的个数。

class Solution {
public:
    vector<int> f;
    int find(int x){
        while(f[x]>=0) x=f[x];
        return x;
    }
    void unio(int x,int y){
        int x1=find(x), y1=find(y);
        if(x1!=y1){
            if(f[x1]<f[y1]){
                f[x1]+=f[y1];
                f[y1]=x1;
            }
            else{
                f[y1]+=f[x1];
                f[x1]=y1;
            }
        }
    }
    int minSwapsCouples(vector<int>& row) {
        int n=row.size();
        int m=n/2,j=0;
        f=vector<int>(m,-1);

        for(int k=0;k<n;k+=2){
            unio(row[k]/2,row[k+1]/2);
        }

        for(int i=0;i<m;i++){
            if(f[i]<0) j++;
        }

        return m-j;
    }
};

你可能感兴趣的:(leetcode)