
一、题目描述💯
- 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 h = arr[j];
let n = h % 2 ? h - 1 : h + 1;
let key1 = arr.indexOf(n);
let key2 = key1 % 2 ? key1 - 1 : key1 + 1;
point++;
console.log(point,"调换次数");
if (arr[key2] == ff) {
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);
}
}
四、简单测试🧪
var arr = [0, 3, 5, 6, 7, 1, 4, 2];
console.log(filter(arr));
感谢🙇
点赞支持👍