# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param nums int整型一维数组 # @return int整型 # class Solution: def __init__(self) -> None: self.count = 0 self.mod = 1000000007 def merge(self, nums:List[int], left, mid, right): # 左右端点 i = left j = mid + 1 arr_n = [] while i <= mid and j <= right: if nums[i] > nums[j]: arr_n.append(nums[j]) j+=1 # 重点 不是+1 因为第一个数组的数字比后面的第一个数字大 # 则第一个数组数组后面的数字也比第一个大 # [3] 6 9 [1] [4] [10] # 第一次要加3 第二次加2 self.count += mid - i + 1 self.count %= self.mod else: arr_n.append(nums[i]) i+=1 while i <= mid: arr_n.append(nums[i]) i+=1 while j <= right: arr_n.append(nums[j]) j+=1 nums[left:right+1] = arr_n def merge_sort(self, nums, left, right): # 1 分开 # 2 合并时候从哪里开始 # 不能一直划分 if left < right: mid = (left + right) // 2 self.merge_sort(nums, left, mid) self.merge_sort(nums, mid+1, right) self.merge(nums, left, mid, right) def InversePairs(self , nums: List[int]) -> int: # 为什么此题的最优解法可以借助归并排序的思想? # 每一个逆序对其实就是排序时的交换(冒泡 归并) if not nums or len(nums) == 1: return self.count n = len(nums) left = 0 right = n-1 self.merge_sort(nums, left, right) print(nums) return self.count