老师,我用归并排序思想解逆序对居然超时了,求解。
来源:3-1 归并排序法 - Merge Sort

qq_朕知道了_1
2020-04-24
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
限制:
0 <= 数组长度 <= 50000
以下是我的代码
var reversePairs = function(nums) {
const len = nums.length
let res = 0
if (len < 2) return 0
return getPairs(nums, 0, len - 1)
function getPairs(arr, left, right) {
let val = 0
if (left >= right) {
return 0
}
const mid = Math.floor(left + (right - left)/2)
val = __getPairs(arr, left, mid, right)
val += getPairs(arr, left, mid)
val += getPairs(arr, mid + 1, right)
return val
}
function __getPairs(arr, left, mid, right) {
let i = left
let val = 0
while (i <= mid) {
for (let j = mid + 1; j <= right; j++) {
if (arr[i] > arr[j]) {
val++
}
}
i++
}
return val
}
};
写回答
1回答
-
你的 __getPairs 函数里是一段 O(n^2) 的算法,本质和归并排序中的 merge 不一样。相当于 i 从 left 走到了 mid,对于每一个 i,j 又从 mid + 1 走到了 right。
基于归并排序的思路求逆序对的算法,我写了一个补充的参考代码,可以参考这里(C++)。里面有详细的注释,看是否能看懂?
继续加油!:)
032020-05-08
相似问题