力扣765.情侣牵手
-
并查集 求置换环
-
置换环:对每个节点,将其指向其排序后应该放到的位置,直到首位相接形成了一个环
交换次数为n-1次(n为环的长度) -
给每对情侣一个编号**,其中编号为[row[i]/2]**
-
遍历当前每一组人,将他们所在的环连接
-
-
iota函数:快速生成递增序列
-
-
const int N = 31; class Solution { int p[N]; public: int minSwapsCouples(vector<int>& row) { int n = row.size()/2; //在[0,n]上填充[0,n] iota(p,p+n,0); for(int i=0;i<n*2;i+=2) { //取出两情侣下标 int a = row[i]/2,b = row[i+1]/2; p[find(a)] = find(b); } int res=n; for(int i=0;i<n;i++) //当i == find(i)时为一个置换环 res -= i == find(i); return res; } int find(int x) { if(p[x] != x) p[x] = find(p[x]); return p[x]; } };