Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
N couples sit in 2N seats arranged in a row and want to hold hands. We want to know 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.

The people and seats are represented by an integer from 0 to 2N-1, 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).

The couples' initial seating is given by row[i] being the value of the person who is initially sitting in the i-th seat.

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.
Note:

len(row) is even and in the range of [4, 60].
row is guaranteed to be a permutation of 0...len(row)-1.

Solution:

class Solution(object):
    def minSwapsCouples(self, row):
        """
        :type row: List[int]
        :rtype: int
        """
        seats = {} # store the two people on couch i
        cur_pos = {} # store the couch person x is sitting now
        for i in range(0, len(row), 2):
            seats[i] = [row[i], row[i+1]]
            cur_pos[row[i]] = i
            cur_pos[row[i+1]] = i
        
        # check each couch, if the two people are already couple, skip
        # otherwise iteratively find the partner for the small one
        ans = 0
        for i in range(0, len(row), 2):
            x, y = seats[i]
            if x > y:
                x, y = y, x
            if x % 2 == 0 and y % 2 == 1:
                continue
            pre = i
            while not (x % 2 == 0 and y % 2 == 1): # not couple yet
                ans += 1
                partner = (x+1) if x % 2 == 0 else (x-1)#x couple id
                partner_cur_pos = cur_pos[partner]#locate x parter's position
                seats[pre] = [x, partner]#update current seats to x+x's couple
                seats[partner_cur_pos].remove(partner)
                seats[partner_cur_pos].append(y)#update the x's couplt's previous seats, executing the swapping
                cur_pos[y] = partner_cur_pos
                cur_pos[partner] = pre
                pre = partner_cur_pos
                x, y = seats[pre]
                if x > y:
                    x, y = y, x
        return ans

Solution: https://leetcode.com/problems/couples-holding-hands/