leetcode765.情侣牵手

如果总共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;*/
    }
}

你可能感兴趣的:(笔记,算法,leetcode)