题目
在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。 输入一个数组,求出这个数组中的逆序对。
例如在数组 {7, 5, 6, 4} 中,一共存在 5 个逆序对,
分别是 (7, 6)、(7, 5)、(7, 4)、(6, 4)和(5, 4)。
leetcode链接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/
思想
- 在归并排序中进行逆数对数量的增加
代码
/**
* @param {number[]} nums
* @return {number}
*/
var reversePairs = function (nums) {
if (nums.length < 2) return 0
let counts = 0
function mergeSort(arr) {
if (arr.length == 1) return arr
const midIndex = Math.floor(arr.length / 2)
const leftArr = arr.slice(0, midIndex)
const rightArr = arr.slice(midIndex)
return merge(mergeSort(leftArr), mergeSort(rightArr))
}
function merge(left, right) {
const result = []
while (left.length && right.length) {
if (right[0] >= left[0]) {
result.push(left.shift())
} else {
counts += left.length
result.push(right.shift())
}
}
return result.concat(left).concat(right)
}
mergeSort(nums)
return counts
}