如何进行网站运营与规划,网页设计个人主页,wordpress阅读时间,网站搭建周期1 题目#xff1a;情侣牵手
官方标定难度#xff1a;难
n 对情侣坐在连续排列的 2n 个座位上#xff0c;想要牵到对方的手。
人和座位由一个整数数组 row 表示#xff0c;其中 row[i] 是坐在第 i 个座位上的人的 ID。情侣们按顺序编号#xff0c;第一对是 (0, 1)#…1 题目情侣牵手
官方标定难度难
n 对情侣坐在连续排列的 2n 个座位上想要牵到对方的手。
人和座位由一个整数数组 row 表示其中 row[i] 是坐在第 i 个座位上的人的 ID。情侣们按顺序编号第一对是 (0, 1)第二对是 (2, 3)以此类推最后一对是 (2n-2, 2n-1)。
返回 最少交换座位的次数以便每对情侣可以并肩坐在一起。 每次交换可选择任意两人让他们站起来交换座位。
示例 1:
输入: row [0,2,1,3] 输出: 1 解释: 只需要交换row[1]和row[2]的位置即可。 示例 2:
输入: row [3,2,0,1] 输出: 0 解释: 无需交换座位所有的情侣都已经可以手牵手了。
提示:
2n row.length 2 n 30 n 是偶数 0 row[i] 2n row 中所有元素均无重复
2 solution
将需要交换位置的情侣合并成一个个小集合每个集合为一个环即 A -B-C-A, 每个环交换 m - 1 次m 为环的大小
代码
class Solution {
public:int minSwapsCouples(vectorint row) {int n row.size() / 2;int f[n];for (int i 0; i n; i) {f[i] i;}auto const find [](auto self, int x) {if (f[x] x) return x;return f[x] self(self, f[x]);};for (int i 0; i n; i) {int x row[i * 2] / 2;int y row[i * 2 1] / 2;int p find(find, y);int q find(find, x);if(p ! q){f[p] q;}}vectorint cnt(n);for(int i 0; i n; i) cnt[find(find, i)];int sum 0;for(int x:cnt) if(x) sum x - 1;return sum;}
};结果