如果总共30对情侣,最多交换29次
解题思路:找到一对情侣,如果是邻座就不动,如果不是邻座,任意交换位置,让原本的两个邻座组成新的邻座
代码实现:
public class Test765 {
public int minSwapsCouples(int[] row) {
//情侣对数为数组总数的一半
//因为要所有情侣都邻座,所以必然0,1一对,2,3一对,如果1,2一对,则0没有情侣
//fr[i]表示第i对情侣的临坐
int[][] fr = new int[row.length / 2][2];
for (int i = 0; i < fr.length; i++) {
fr[i][0] = -1;
fr[i][1] = -1;
}
//建立邻座关系
for (int i = 0; 2 * i < row.length; i++) {
if (fr[row[2 * i] / 2][0] == -1) {
fr[row[2 * i] / 2][0] = row[2 * i + 1] / 2;
} else {
fr[row[2 * i] / 2][1] = row[2 * i + 1] / 2;
}
if (fr[row[2 * i + 1] / 2][0] == -1) {
fr[row[2 * i + 1] / 2][0] = row[2 * i] / 2;
} else {
fr[row[2 * i + 1] / 2][1] = row[2 * i] / 2;
}
}
int num = 0;
for (int i = 0; i < fr.length; i++) {
//如果邻座是自己,则不需要换位置
if (fr[i][0] == i) {
continue;
}
//交换邻座位置
change(fr, i, fr[i][0], fr[i][1]);
num++;
}
return num;
}
//如果邻座分别是f1和f2,则f1也有i这个邻座,改为f2,f2的邻座改为f1,则交换位置完成
private void change(int[][] fr, int i, int f1, int f2) {
if (fr[f1][0] == i) {
fr[f1][0] = f2;
} else {
fr[f1][1] = f2;
}
if (fr[f2][0] == i) {
fr[f2][0] = f1;
} else {
fr[f2][1] = f1;
}
//把邻座换成自己,因为不会再进行判断,所以可以省略
/* fr[i][0] = i;
fr[i][1] = i;*/
}
}