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. Aswapconsists of choosing any two people, then they stand up and switch seats.
The people and seats are represented by an integer from0to2N-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 byrow[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].
rowis guaranteed to be a permutation of0...len(row)-1.
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 res = 0;
for (int i = 0; i < n; i += 2) {
// 如果已经组成一对couple, 无需swap
if (row[i]/2 == row[i + 1]/2) continue;
int partnerIndex = 0;
if (row[i] % 2 == 0) {
partnerIndex = pos[row[i]/2 * 2 + 1];
}
else {
partnerIndex = pos[row[i]/2 * 2];
}
// update pos array
pos[row[i + 1]] = partnerIndex;
// swap position of row[i + 1] and row[partnerIndex] to make couple
swap(row, i + 1, partnerIndex);
++res;
}
return res;
}
public void swap(int[] row, int i, int j) {
int temp = row[i];
row[i] = row[j];
row[j] = temp;
}
}