并查集
1.首先初始状态把这N对情侣分别构成一个连通块
2.考虑k对情侣相互错开的情况,他们形成一个环,可以知道需k-1次交换使排列正确
3.这样相互错开的情况,分别构成连通块,最后用N - 连通块个数即为答案
例如:0,1|2,3|… |2N-2,2N-1
|0 3| … |7 2|…|6 1| 看相对顺序,可以发现这三对构成一个环,只需2次交换
同理还有其他类型的环构成连通块
vector<int> pre;void init(int n){for(int i = 0;i < n;i += 2){pre.push_back(i);pre.push_back(i);}}int find(int x){if(x == pre[x]) return x;// 路径压缩else{pre[x] = find(pre[x]);return pre[x];}}int minSwapsCouples(vector<int>& row) {if(row.empty())return 0;int n = row.size();init(n);for (int i = 0; i < n; i += 2) {pre[find(row[i + 1])] = find(row[i]);}int res = n / 2;//每有一个连通块,会减少一次交换次数for (int i = 0; i < n; i ++) {if (pre[i] == i) res --;}return res;}
