思路解析:用一个全局变量记录逆序数,然后将数组拆分,一分为二,分治思想, 但是分治后,再重组需要考虑,两个数组的关系每项关系,且分治的每一项返回的都是有序数组,如果被分治的数组长度小于2,则直接返回它的值,如果长度为2,则直接比较他们的值,按照正序排列,如果长度大于2,则需要再次分治,直到被分治的数组长度<=2
const reversePairs = (nums) => {
let count = 0;
const mergeSort = (arr) => {
if (arr.length < 2) return arr;
if (arr.length === 2) {
if (arr[0] <= arr[1]) return arr;
count++;
return [arr[1], arr[0]];
}
const mid = arr.length >> 1;
const left = mergeSort(arr.slice(0, mid));
const right = mergeSort(arr.slice(mid));
const res = [];
let [i, j] = [0, 0];
while (i < left.length || j < right.length) {
if (i >= left.length) {
res.push.apply(res, right.slice(j));
break;
}
if (j >= right.length) {
res.push.apply(res, left.slice(i));
break;
}
if (left[i] <= right[j]) {
res.push(left[i]);
i++;
} else {
res.push(right[j]);
j++;
count += left.length - i;
}
}
return res;
};
mergeSort(nums);
return count;
};
调试代码
console.log(reversePairs([7, 5, 6, 4]));
代码分析