Couples Holding Hands

hard graph union find greedy

Problem

2n people are seated in a row (0, 1, …, 2n − 1). Couple i is people (2i, 2i + 1). Return the minimum number of swaps so every couple sits side by side (positions 2k and 2k + 1).

Inputrow = [0, 2, 1, 3]
Output1
Swap seats 1 and 2 to get [0,1,2,3]. Each couple is adjacent.

def min_swaps_couples(row):
    pos = {p: i for i, p in enumerate(row)}
    swaps = 0
    for i in range(0, len(row), 2):
        partner = row[i] ^ 1
        if row[i + 1] != partner:
            j = pos[partner]
            row[i + 1], row[j] = row[j], row[i + 1]
            pos[row[j]] = j
            pos[row[i + 1]] = i + 1
            swaps += 1
    return swaps
function minSwapsCouples(row) {
  const pos = new Map();
  for (let i = 0; i < row.length; i++) pos.set(row[i], i);
  let swaps = 0;
  for (let i = 0; i < row.length; i += 2) {
    const partner = row[i] ^ 1;
    if (row[i + 1] !== partner) {
      const j = pos.get(partner);
      pos.set(row[i + 1], j);
      pos.set(partner, i + 1);
      [row[i + 1], row[j]] = [row[j], row[i + 1]];
      swaps++;
    }
  }
  return swaps;
}
class Solution {
    public int minSwapsCouples(int[] row) {
        int n = row.length;
        int[] pos = new int[n];
        for (int i = 0; i < n; i++) pos[row[i]] = i;
        int swaps = 0;
        for (int i = 0; i < n; i += 2) {
            int partner = row[i] ^ 1;
            if (row[i + 1] != partner) {
                int j = pos[partner];
                pos[row[i + 1]] = j;
                pos[partner] = i + 1;
                int tmp = row[i + 1]; row[i + 1] = row[j]; row[j] = tmp;
                swaps++;
            }
        }
        return swaps;
    }
}
class Solution {
public:
    int minSwapsCouples(vector<int>& row) {
        int n = row.size();
        vector<int> pos(n);
        for (int i = 0; i < n; i++) pos[row[i]] = i;
        int swaps = 0;
        for (int i = 0; i < n; i += 2) {
            int partner = row[i] ^ 1;
            if (row[i + 1] != partner) {
                int j = pos[partner];
                pos[row[i + 1]] = j;
                pos[partner] = i + 1;
                swap(row[i + 1], row[j]);
                swaps++;
            }
        }
        return swaps;
    }
};
Time: O(n) Space: O(n)