[路飞]leetcode-剑指 Offer 51. 数组中的逆序对

100 阅读1分钟

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。力扣原文

示例 1:

输入: [7,5,6,4]
输出: 5

解题:

var reversePairs = function (nums) {
  let temps = new Array(nums.length).fill(0);
  const sort = (left, right) => {
    if (left >= right) return 0;
    let ans = 0;
    let mid = (left + right) >> 1;
    ans += sort(left, mid);
    ans += sort(mid + 1, right);
    let k = left,
      p1 = left,
      p2 = mid + 1;
    while (p1 <= mid || p1 <= right) {
      if (p2 > right || (p1 <= mid && nums[p1] <= nums[p2])) {
        temps[k++] = nums[p1++];
      } else {
        temps[k++] = nums[p2++];
        ans += mid - p1 + 1;
      }
    }
    for (let i = 0; i <= right; i++) nums[i] = temps[i];
    return ans;
  };
  return sort(0, nums.length - 1);
};