Couples Holding Hands
There are n
couples sitting in 2n
seats arranged in a row and want to hold hands.
The people and seats are represented by an integer array row
where row[i]
is the ID of the person sitting in the ith
seat. The couples are numbered in order, the first couple being (0, 1)
, the second couple being (2, 3)
, and so on with the last couple being (2n - 2, 2n - 1)
.
Return the minimum number of swaps so that every couple is sitting side by side. A swap consists of choosing any two people, then they stand up and switch seats.
Example 1:
Input: row = [0,2,1,3] Output: 1 Explanation: We only need to swap the second (row[1]) and third (row[2]) person.
Example 2:
Input: row = [3,2,0,1] Output: 0 Explanation: All couples are already seated side by side.
Constraints:
2n == row.length
2 <= n <= 30
n
is even.0 <= row[i] < 2n
- All the elements of
row
are unique.
from collections import defaultdict
class Solution:
def root(self, x, parent):
if parent[x] == x:
return x
parent[x] = self.root(parent[x], parent)
return parent[x]
def connect(self, x, y, parent):
x = self.root(x, parent)
y = self.root(y, parent)
if x != y:
parent[x] = y
def minSwapsCouples(self, row: List[int]) -> int:
n = len(row)
graph = defaultdict(list)
pos = {}
for i in range(n):
pos[row[i]] = i
for i in range(n // 2):
a = row[2 * i]
a = a + 1 - 2 * (a % 2)
b = row[2 * i + 1]
b = b + 1 - 2 * (b % 2)
graph[i].append(pos[a] // 2)
graph[i].append(pos[b] // 2)
parent = list(range(n // 2))
for i in graph:
for j in graph[i]:
self.connect(i, j, parent)
for i in graph:
parent[i] = self.root(i, parent)
ctr = 0
for i in range(n // 2):
if parent[i] != i:
ctr += 1
return ctr
Comments
Post a Comment