题目描述:
N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手。 计算最少交换座位的次数,以便每对情侣可以并肩坐在一起。 一次交换可选择任意两人,让他们站起来交换座位。
人和座位用 0
到 2N-1
的整数表示,情侣们按顺序编号,第一对是 (0, 1)
,第二对是 (2, 3)
,以此类推,最后一对是 (2N-2, 2N-1)
。
这些情侣的初始座位 row[i]
是由最初始坐在第 i 个座位上的人决定的。
输入描述:输入有2行,第一行为n,第二行为row
输出描述:输出最少交换座位的次数。
示例 1:
输入: 2 0 2 1 3 输出: 1 解释: 我们只需要交换row[1]和row[2]的位置即可。
示例 2:
输入: 2 3 2 0 1 输出: 0 解释: 无需交换座位,所有的情侣都已经可以手牵手了。
参考代码
1 import java.util.Scanner; 2 3 public class Test { 4 public static void main(String[] args) { 5 Scanner in = new Scanner(System.in); 6 int n = in.nextInt(); 7 int[] row = new int[2 * n]; 8 int sum = 0; 9 for (int i = 0; i < row.length; i++) { 10 row[i] = in.nextInt(); 11 } 12 System.out.println(minSwapsCouples(row)); 13 14 } 15 public static int minSwapsCouples(int[] row) { 16 int n=0; 17 //只需要遍历下标为偶数的座位,每次+2,奇数的座位可由交换座位匹配好 18 for(int i=0;i<=row.length-2;i+=2){ 19 int j; 20 //判断下标i的情侣是多少 21 j=row[i]%2==0?row[i]+1:row[i]-1; 22 //若下一个座位的不是该情侣 23 if(row[i+1]!=j){ 24 //需要进行交换座位 25 n++; 26 //找到该情侣,进行交换 27 for(int m=i+2;m<row.length;m++){ 28 // 如果m从0开始找的话,算法复杂度高,会超时,应该从i+2开始找! 29 if(row[m]==j){ 30 swap(row,m,i+1); 31 break; // 交换后记得break 32 } 33 } 34 } 35 } 36 return n; 37 } 38 39 //交换 40 private static void swap(int[] a,int i,int j){ 41 int tmp=a[i]; 42 a[i]=a[j]; 43 a[j]=tmp; 44 } 45 46 }Demo 1
参考博客:https://www.cnblogs.com/lyh28/p/10630649.html