描述
N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手。 计算最少交换座位的次数,以便每对情侣可以并肩坐在一起。
一次交换可选择任意两人,让他们站起来交换座位。人和座位用 0 到 2N-1 的整数表示,情侣们按顺序编号,第一对是 (0, 1),第二对是 (2, 3),以此类推,最后一对是
(2N-2, 2N-1)。这些情侣的初始座位 row[i] 是由最初始坐在第 i 个座位上的人决定的。
示例
示例 1:
输入: row = [0, 2, 1, 3] 输出: 1 解释: 我们只需要交换row[1]和row[2]的位置即可。 示例 2:
输入: row = [3, 2, 0, 1] 输出: 0 解释: 无需交换座位,所有的情侣都已经可以手牵手了。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/couples-holding-hands
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
配对成功意味着 偶数位的数和奇数位的数是 2n 和 2n+1
也就是说,我们可以通过每次配对两个,直到将所有没配对成功的都配对成功。
而在交换的过程中,也会存在没有遍历到的时候就交换配对成功,我们并不需要关心
代码
class Solution:
def minSwapsCouples(self, row: List[int]) -> int:
# 找到有多少对牵手成功
n = len(row)
res = 0
for i in range(0, n, 2):
if row[i] == row[i+1] ^ 1:
continue
for j in range(i+1, n):
if row[i] == row[j] ^ 1:
row[i+1], row[j] = row[j], row[i+1]
res += 1
break
return res
复杂度分析
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)