1、为啥是直接交换?而最终就能确保是最少交换次数?
注意,我不需要排序,只需要俩个为一组相邻即可!
1对情侣 2个人 交换0
2对情侣 4个人 交换1 0,2,1,3
3对情侣 6个人 交换2 1,2,0,5,4,3
故而得出规律:n对情侣 最少只需要交换n/2次
2、为啥引入数组哈希?
1,2,0,5,4,3
推导过程:咱们遍历整个数组,俩个数字为一组,我只看一组里面的第一个数,他右边是不是自己的情侣,是的话直接下一组,不是的话,就开始琢磨,直接把右边的人和自己的情侣交换位置就好了,这个倒很简单。你可以通过异或得到一组中第一个数的情侣,直接赋值到右边就好了,但是你右边情侣原来的位置下标是多少啊?不然你怎么讲右边的原来的其他人换过去啊?
所以就引入了哈希,使用数组哈希是因为数值小简单。这样子就可以通过数值知道对应所处的位置下标了。
3、异或操作判断是否相邻
6 110
5 101 5^1 = 101^001 = 100
4 100 4^1 = 100^001 = 101
class Solution {
public int minSwapsCouples(int[] row) {
int len = row.length;
int[] cur = new int[len];
//使用数组模拟哈希(数据量小可用)
for(int i = 0;i < len;i++){
cur[row[i]] = i;
}
int ans = 0;
for(int i = 0;i < len - 1;i += 2){
if(row[i + 1] != (row[i]^1)){
int src = i + 1; //获取交换目标的下标
int tar = cur[row[i] ^ 1];//获取另外一个情侣的下标
cur[row[tar]] = src;//更正另外一个情侣情侣数值与下标的哈希
cur[row[src]] = tar;
//更正相邻下标对应的数值为情侣
int tmp = row[tar];//获取另外一个情侣的数值
row[tar] = row[src];
row[src] = tmp;
ans++;
}
}
return ans;
}
}