Skip to content

765.情侣牵手

今天双11,但我感觉好像一个月前双11活动就开始了,今天居然才是双11

我的思路是贪心,代码如下

javascript
var minSwapsCouples = function(row) {
  const swap = (arr, a, b) => {
    let cur = arr[a]
    arr[a] = arr[b]
    arr[b] = cur
  }


  let len = row.length;
  let res = 0;
  let cache = [];

  // cache方便查找对应值的索引是多少
  for (let i = 0; i < len; i++) {
    cache[row[i]] = i;
  }

  // 遍历情侣对
  for (let i = 0; i < len - 1; i += 2) {
    // 情侣对第一个数的值
    let a = row[i];
    // 排列完成后,左边肯定是偶数,右边为奇数,当a为偶数时,b为a+1,a为奇数时,b为a-1
    let b = a ^ 1;

    // 如果row[i + 1] === b,说明这一组已经在最终位置了
    // 如果row[i + 1] !== b,说明需要换位置
    if (row[i + 1] !== b) {
      // src是当前位置后一位置索引
      let src = i + 1
      // tar是最终值在row中的索引
      let tar = cache[b]

      // 交换元素之前同步cache
      cache[row[tar]] = src
      cache[row[src]] = tar

      // 交换并计数
      swap(row, src, tar)
      res++;
    }
  }

  return res;
};