哈希 + 贪心(765. 情侣牵手)

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;
    }
}

你可能感兴趣的:(算法笔记,哈希算法,算法,数据结构)