leetcode 493题 [hard]
中:翻转对
英:Reverse Pairs
题解1:归并法
-
假设当前两个子序列都排好序且统计了翻转对数量,那么对这两个子序列合并只需要再统计
nums[i]
在左子序列,nums[j]
在右子序列的翻转对数即可。(递归归并思想) -
子序列排序的目的:优化翻转对的计算,具体可见代码注释
-
时间复杂度:O(nlogn)
(归并法分割开销 O(logn))* [(子序列计算翻转对开销 O(n))+ (子序列排序开销 O(n))] => O(nlogn) -
空间复杂度:O(n) 归并数组
-
实现
/** * @param {number[]} nums * @return {number} */ var reversePairs = function(nums) { /** * 归并排序法 + 优化剪枝 * 时间复杂度:O(nlogn) * 空间复杂度:O(n) 归并新数组 */ // 预处理(无) let result = 0; // 统计重要翻转对数 // 归并排序法 function notJustMergeSort(_nums){ // 预处理 if(_nums.length <=