#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param nums int整型一维数组
# @return int整型
#
import math
class Solution:
mod = 1000000007
def merge_sort(self, start_index, end_index, nums):
"""
"""
if start_index == end_index:
return 0, [nums[start_index]]
if (start_index + end_index) % 2 == 0:
mid = int((start_index + end_index) / 2)
else:
mid = int((start_index + end_index + 1) / 2)
# print("start, mid, end:",start_index, mid, end_index)
if mid <= start_index + 1:
res1 = 0
nums1 = [nums[start_index]]
else:
res1, nums1 = self.merge_sort(start_index, mid, nums)
# print("merge_sort input:", start_index, mid, nums)
# print("merge_sort output:", res1, nums1)
if mid + 1 >= end_index:
res2 = 0
nums2 = [nums[mid]]
else:
res2, nums2 = self.merge_sort(mid, end_index, nums)
# print("merge_sort input:", mid, end_index, nums)
# print("merge_sort output:", res2, nums2)
res = (res1 + res2) % self.mod
# print("res1:", res1, " res2:", res2)
# print("nums1:", nums1, " num2:", nums2)
new_nums = []
if nums1[-1] < nums2[0]:
new_nums = nums1
new_nums.extend(nums2)
elif nums2[-1] < nums1[0]:
res += len(nums1) * len(nums2)
new_nums = nums2
new_nums.extend(nums1)
else:
nums1_len = len(nums1)
i = 0
nums2_len = len(nums2)
j = 0
while True:
if nums1[i] < nums2[j]:
new_nums.append(nums1[i])
i += 1
elif nums1[i] > nums2[j]:
res += nums1_len - i
new_nums.append(nums2[j])
j += 1
if i >= nums1_len:
new_nums.extend(nums2[j:])
break
if j >= nums2_len:
new_nums.extend(nums1[i:])
break
return res % self.mod, new_nums
def InversePairs(self , nums: List[int]) -> int:
len_ = len(nums)
res, new_nums = self.merge_sort(0, len_, nums)
print("new_nums:", new_nums)
return res % 1000000007