剑指 Offer 51. 数组中的逆序对

85 阅读1分钟

剑指 Offer 51. 数组中的逆序对

思路解析:用一个全局变量记录逆序数,然后将数组拆分,一分为二,分治思想, 但是分治后,再重组需要考虑,两个数组的关系每项关系,且分治的每一项返回的都是有序数组,如果被分治的数组长度小于2,则直接返回它的值,如果长度为2,则直接比较他们的值,按照正序排列,如果长度大于2,则需要再次分治,直到被分治的数组长度<=2

const reversePairs = (nums) => {
  let count = 0;
  const mergeSort = (arr) => {
    if (arr.length < 2) return arr;
    if (arr.length === 2) {
      if (arr[0] <= arr[1]) return arr;
      count++;
      return [arr[1], arr[0]];
    }
    const mid = arr.length >> 1;
    const left = mergeSort(arr.slice(0, mid));
    const right = mergeSort(arr.slice(mid));
    const res = [];
    let [i, j] = [0, 0];
    while (i < left.length || j < right.length) {
      if (i >= left.length) {
        res.push.apply(res, right.slice(j));
        break;
      }
      if (j >= right.length) {
        res.push.apply(res, left.slice(i));
        break;
      }
      if (left[i] <= right[j]) {
        res.push(left[i]);
        i++;
      } else {
        res.push(right[j]);
        j++;
        count += left.length - i;
      }
    }
    return res;
  };
  mergeSort(nums);
  return count;
};

调试代码

console.log(reversePairs([7, 5, 6, 4]));

image.png

代码分析

image.png