哈希 + 贪心(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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

能吧够

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值