diff --git "a/_posts/Algorithms/leetcode/2023-11-11-765. \346\203\205\344\276\243\347\211\265\346\211\213.md" "b/_posts/Algorithms/leetcode/2023-11-11-765. \346\203\205\344\276\243\347\211\265\346\211\213.md" new file mode 100644 index 0000000000..b627b92eb7 --- /dev/null +++ "b/_posts/Algorithms/leetcode/2023-11-11-765. \346\203\205\344\276\243\347\211\265\346\211\213.md" @@ -0,0 +1,68 @@ +--- +layout: post +category: leetcode +title: 765. 情侣牵手 +tags: leetcode +--- + +## title +[problem link](https://leetcode.cn/problems/couples-holding-hands/description/?envType=daily-question&envId=2023-11-11) + +`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` 中所有元素均**无重复** + +## solution + +It could save one exchange operation for one cycle. + +Find the number of cycles. + +```python + +class Solution: + def minSwapsCouples(self, row: List[int]) -> int: + n = len(row) + uf = UnionFind() + for i in range(0, n, 2): + uf.union(i,i+1) + m = n // 2 + for i in range(0, n, 2): + uf.union(row[i], row[i+1]) + cnt = 0 + for i in range(n): + if uf.find(i) == i: + cnt += 1 + return m - cnt +``` +