leetcode765.情侣牵手

96 篇文章 1 订阅
81 篇文章 1 订阅

如果总共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;*/
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值