情人节之情侣👫牵手的问题 | 刷题打卡

565 阅读2分钟

一、题目描述💯

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

二、思路分析

  • 先去掉不需要调换的情侣,即去掉数组arr的值
  • 接下来 arr就全部是顺序混乱的情侣分配,这时,默认先调换第一组,如何保证是最少,采用并查集的方法,每查找一个,计算point之后,就将其从arr去除,直到全部查找完
  • 不断查找并查集(check函数),每查找一个,去除一个(quchong函数),直到arr.length为1
  • return ponint

三、代码实现🌂

var point = 0
function filter(arr) {
 let ar = JSON.stringify(arr);
 let arr1 = JSON.parse(ar);
 //循环数组,去掉已经是情侣的
 for (let i = 0; i < arr1.length; i++) {
   //判断相邻的两个情侣是否为一对
   if (arr1[i] % 2 == 0 && arr1[i + 1] - arr1[i] == 1) {
     let index1 = arr.indexOf(arr1[i]);
     let index2 = arr.indexOf(arr1[i+1]);
     arr.splice(index1,1)
     arr.splice(index2,1)
   } else if (arr1[i] % 2 == 1 && arr1[i] - arr1[i + 1] == 1) {
     let index1 = arr.indexOf(arr1[i]);
     let index2 = arr.indexOf(arr1[i+1]);
     arr.splice(index1,1)
     arr.splice(index2,1)
   }
   i++;
 }
 return arr.length>0?findArr(arr):0;
}
function quchong(a, b) {
 for (let i = 0; i < b.length; i++) {
   for (let j = 0; j < a.length; j++) {
     if (a[j] == b[i]) {
       a.splice(j, 1);
       j = j - 1;
     }
   }
 }
 return a;
}
function findArr(arr) {
 //循环数组
 let ff = arr[0] % 2 ? arr[0] + 1 : arr[0] + 1;
 let p = [];
 //不断查找并集表
 if(arr.length>1){
 check(arr,p,ff,1)
 }else{
     return point
 }
 console.log(p,arr);
}
 function check(arr, p,ff,j) {
   // let arr2 = arr
   let h = arr[j]; //3 4 6
   let n = h % 2 ? h - 1 : h + 1; //2 5 7
   let key1 = arr.indexOf(n); //7 2 4
   let key2 = key1 % 2 ? key1 - 1 : key1 + 1; //6 3 5
   point++;
   console.log(point,"调换次数");
   if (arr[key2] == ff) {
     //4 6 1
     p.push(arr[j]);
     p.push(arr[key1]);
     p.push(ff);
     let arr11 = quchong(arr,p)
     findArr(arr11)//返回上一层
   } else {
     p.push(arr[j]);
     p.push(arr[key1]);
     check(arr, key2); //6 3
   }
 }

四、简单测试🧪

var arr = [0, 3, 5, 6, 7, 1, 4, 2];
console.log(filter(arr));

代码下载地址

感谢🙇‍

点赞支持👍