题目描述

解题思路
- 我刚开始看到本题,首先想到的是暴力解法,也就是通过for循环进行不断遍历,结果超时。
- 看了题解才知道,解决逆序对的问题,往往通过归并排序
- 本题考查的本质还是归并排序,只是在归并排序的基础上,增加了一行代码而已。
- 归并排序使用的是分治法的思想,本题就是建立在还是合并的时候,进行统计计算,最终求出结果。
解题代码一(暴力法:超时)
var reversePairs = function(nums) {
let flag = 0;
for (let i = 0; i < nums.length; i++) {
const temp = nums.slice(i+1);
for (let v of temp) {
if (v < nums[i]) {
flag++;
}
}
}
return flag;
};
解题代码二(归并排序)
var reversePairs = function(nums) {
let sum = 0;
mergeSort(nums);
return sum;
function mergeSort(nums) {
if (nums.length < 2) return nums;
let mid = Math.floor(nums.length / 2);
let left = nums.slice(0,mid);
let right = nums.slice(mid);
return merge(mergeSort(left),mergeSort(right));
}
function merge(left,right) {
const res = [];
const leftLen = left.length;
const rightLen = right.length;
for (let i = 0,j = 0,index=0;index < leftLen + rightLen; index++) {
if (i >= leftLen) {
res.push(right[j++])
} else if (j >= rightLen) {
res.push(left[i++]);
} else if (left[i] <= right[j]) {
res.push(left[i++])
} else {
res.push(right[j++]);
sum = sum + leftLen - i
}
}
return res;
}
};
总结(本题给我们的启示思路)
- 启示一:学会使用归并排序
- 启示二:学会归并排序的分治思想