LeetCode765.情侣牵手(Java)

题目

N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手。
计算最少交换座位的次数,以便每对情侣可以并肩坐在一起。一次交换可选择任意两人,让他们站起来交换座位。
人和座位用 0 到 2N-1 的整数表示,情侣们按顺序编号,第一对是 (0, 1),第二对是 (2, 3),以此类推,最后一对是(2N-2, 2N-1)。
这些情侣的初始座位 row[i] 是由最初始坐在第 i 个座位上的人决定的。

示例 1:
输入: row = [0, 2, 1, 3]
输出: 1
解释: 我们只需要交换row[1]和row[2]的位置即可。
示例 2:
输入: row = [3, 2, 0, 1]
输出: 0
解释: 无需交换座位,所有的情侣都已经可以手牵手了。

分析

找规律,(2N-2,2N-1),成对的一个是偶数一个奇数。
如果前面是偶数,后面那个就是前面数+1;
如果前面是奇数,后面那个是前面数 -1;

代码

public int minSwapsCouples(int[] row) {
		int count = 0;
		int left = 0;
		while (left < row.length) {
			int right = judge(row[left]);
			int index = left + 1;
			if (row[index] != right) {
				while (index < row.length && row[index] != right) {
					index++;
				}
				count++;
				swap(row, left, index);
			}
			left += 2;
		}
		return count;
	}

public int judge(int num) {
		if (num % 2 == 0) {
			return num + 1;
		} else {
			return num - 1;
		}
	}

public void swap(int[] row, int left, int right) {
		int temp = row[left + 1];
		row[left + 1] = row[right];
		row[right] = temp;
	}

参考

LeetCode765.情侣牵手(Java)_第1张图片

class Solution {
    public int minSwapsCouples(int[] row) {
        int res = 0;
        for(int i = 0;i<row.length;i+=2){
            int key = row[i];
            if(row[i + 1] == (key ^ 1)){
                continue;
            }
            res++;
            for(int j = i + 1;j<row.length;j++){
                if(row[j] == (key ^ 1)){
                    row[j] = row[i + 1];
                    row[i + 1] = key ^ 1;
                }
            }
        }
        return res;
    }
}

end.

你可能感兴趣的:(LeetCode刷题)