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

 

示例 1:

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

 

限制:

0 <= 数组长度 <= 50000

 

使用归并排序完成

/**
 * @param {number[]} nums
 * @return {number}
 */
var reversePairs = function (nums) {
    let res = 0;


    var mergeSort = function (nums) {
        if (nums.length <= 1) {
            return nums
        }
        let mid = Math.floor(nums.length / 2);
        // console.log(mid)
        let leftarr = nums.slice(0, mid);
        let rightrr = nums.slice(mid);
        return merge(mergeSort(leftarr), mergeSort(rightrr))
        function merge(left, right) {
            let result = [];
            while (left.length > 0 && right.length > 0) {
                if (left[0] > right[0]) {
                    res += left.length
                    result.push(right.shift());
                }
                else {
                    result.push(left.shift());
                }
            }
            /* 当左右数组长度不等.将比较完后剩下的数组项链接起来即可 */
            return result.concat(left).concat(right);
        }

    };
    mergeSort(nums)
    return res
}

console.log(reversePairs([1, 3, 2, 3, 1]))