跳到主要内容

765.情侣牵手

链接:765.情侣牵手
难度:Hard
标签:贪心、深度优先搜索、广度优先搜索、并查集、图
简介:N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手。 计算最少交换座位的次数,以便每对情侣可以并肩坐在一起。 一次交换可选择任意两人,让他们站起来交换座位。

题解 1 - typescript

  • 编辑时间:2021-02-14
  • 执行用时:84ms
  • 内存消耗:40.2MB
  • 编程语言:typescript
  • 解法介绍:储存所有值进行交换。
function minSwapsCouples(row: number[]): number {
const map: Record<number, number> = {};
row.forEach((num, i) => (map[num] = i));
const swap = (num1: number, num2: number) => {
[row[map[num1]], row[map[num2]]] = [row[map[num2]], row[map[num1]]];
[map[num1], map[num2]] = [map[num2], map[num1]];
};
let ans = 0;
for (let i = 0, l = row.length - 1; i < l - 1; i += 2) {
const num = row[i];
const nextNum = row[i + 1];
const needNum = num & 1 ? num - 1 : num + 1;
if (nextNum !== needNum) {
ans++;
swap(needNum, nextNum);
}
}
return ans;
}

题解 2 - python

  • 编辑时间:2023-11-11
  • 执行用时:48ms
  • 内存消耗:15.68MB
  • 编程语言:python
  • 解法介绍:贪心的每次没有匹配上去重置。
class Solution:
def minSwapsCouples(self, row: List[int]) -> int:
n = len(row)
map = {row[i]: i for i in range(n)}
ans = 0
for i in range(0, n, 2):
if row[i] ^ 1 != row[i + 1]:
map[row[i + 1]] = map[row[i] ^ 1]
row[map[row[i] ^ 1]], row[i + 1] = row[i + 1], row[map[row[i] ^ 1]]
ans += 1
return ans